有一个排过序的字符串数组,但是其中有插入了一些空字符串,请设计一个算法,找出给定字符串的位置。算法的查找部分的复杂度应该为log级别。
给定一个string数组str,同时给定数组大小n和需要查找的string x,请返回该串的位置(位置从零开始)。
测试样例:
["a","b","","c","","d"],6,"c"
返回:3
【思路】二分查找,需要特殊处理的是当str[mid]==" "时,无法判断去低区间还是高区间,解决办法是,向左遍历到第一个不是不空的字符串,再做比较。如果左边全部为空,则跳到右半边。
class Finder {
public:
int findString(vector<string> str, int n, string x) {
// write code here
if(str.size()==0) return -1;
int low= 0, high = str.size()-1;
while(low <=high){
int mid = low + (high - low) /2;
if(str[mid]!=" "){
if(x==str[mid])
return mid;
else if(x < str[mid]){
high = mid-1;
}else if(x > str[mid]){
low = mid +1;
}
}else{
int i = mid;
while(i >=low && str[i]==" ")
--i;
if(i < low)
low = mid +1;
if(x == str[i])
return i;
else if(x > str[i])
low = i +1;
else if(x < str[i])
high = i -1;
}
}
return -1;
}
};