F : A DS二分查找_寻找比目标字母大的最小字母

Description

给你一个字符串str,字符串中的字母都已按照升序排序,且只包含小写字母。另外给出一个目标字母target,请你寻找在这一有序字符串里比目标字母大的最小字母。
在比较时,字母是依序循环出现的。例如,str=“ab”,target=‘z’,则答案为’a’。
字符串str至少包含了两个不同的字母。
target是一个小写字母。
要求必须使用二分查找来解题。

Input

第一行输入t,表示有t个测试样例。
第二行起,每一行首先输入一个字符串str,接着输入目标字母target。
以此类推共输入t个测试样例。
接收字符串可以使用:#include ,string str; cin>>str;

Output

每一行输出字符串中比目标字母大的最小字母。
以此类推共输出t行。

Sample

#0

Input

7
abcd a
abcd b
acegi r
abce c
aaaabbbbbccc b
aaaaabbbbbccccceeeee c
aaabbcccddd z

Output

b
c
a
e
c
e
a

Hint

2 <= str.length() <= 10000000

解题思路

需要考虑的细节是二分查找后如果压缩出来的这个字母仍然比target小怎么办?
则说明此时已经查找到了字符串中的最后一个字母(下标不一定是最后一个),那就在函数的结尾加上一个判断即可,如果此时的字符仍然比target小,因为字符是循环出现,所以就跳转回第一个字符

AC代码

#include
#include
#include
#include
using namespace std;
const int N = 101;

char target;
string str;
bool check(int x)
{
	return str[x]-97> target-97;
}
char StrBinarySearch()
{
	int l, r;
	l = 0, r = str.length()-1;

	while (l < r)
	{
		int mid = l + r>>1;
		if (check(mid))r = mid;
		else l = mid + 1;
	}
	if ((l == str.length() - 1 || str[l] == str[str.length() - 1]) && str[l] < target)l = 0;
	return str[l];
}
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		cin >> str >> target;
		cout << StrBinarySearch() << endl;
	}
	return 0;
}

你可能感兴趣的:(数据结构与算法cpp,算法)