Given a sorted array of strings which is interspersed with empty strings, write a method to find the location of a given string.
Example: find “ball” in [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”, “dad”, “”, “”] will return 4
Example: find “ballcar” in [“at”, “”, “”, “”, “”, “ball”, “car”, “”, “”, “dad”, “”, “”] will return -1
可以直接遍历一遍查找,但是O(n)不够好;
因为已经排好序,所以binary search.
每次t=mid,然后遇到空格就t++直到大于high。
1.如果t>high,说明[mid, high]这一段都是空格,就需要在[low, mid-1]去找。
2.如果在[mid, t]这一段里面找到x,那么就返回。
3.如果在[mid, t]第一个不是空格的string > x, 说明x要在[low, mid-1]去找。
3.如果在[mid, t]第一个不是空格的string < x, 说明x要在[t+1, high]去找。
#include <iostream>
#include <string>
using namespace std;
int search(string s[], int low, int high, string x)
{
if(x=="")
return -1;
while(low<=high)
{
int mid=low+(high-low)/2;
int t=mid;
while(s[t]=="" && t<=high)
t++;
if(t>high)
{
high=mid-1;
}
else
{
if(s[t]==x)
return t;
else if(s[t]>x)
high=mid-1;
else
low=t+1;
}
}
return -1;
}
int main()
{
string s[13] =
{
"at", "", "", "", "ball", "", "", "car", "", "", "dad", "", ""
};
cout<<search(s, 0, 12, "ball")<<endl;
return 0;
}