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<iostream>
#include<cstring>
#include<algorithm>
#include<string>
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;
}