稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。
示例1:
输入: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ta"
输出:-1
说明: 不存在返回-1。
示例2:
输入:words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ball"
输出:4
提示:
words的长度在[1, 1000000]之间
题解:
这道题我的思路就是分治法加二分法,然后如果是空格的话,就不断地缩小范围。然后左右两边进行分治,难点应该就是二分的左右边界,这个可以看一下这位博主:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/er-fen-cha-zhao-suan-fa-xi-jie-xiang-jie-by-labula/
然后分治的话,就注意如果已经找到了target就返回,也可以设置全局变量,这样会比较好理解。
code:
class Solution {
public:
int findString(vector<string>& words, string s) {
int low = 0,high = words.size()-1,mid;
return binary(words,s,0,high);
}
int binary(vector<string>& words, string s,int low,int high)
{
while(low <= high)
{
int mid = (high + low)/2;
if(words[mid] == s)
{
return mid;
}
else if(words[mid] == "")
{
int mid1 = mid,mid2 = mid;
while(mid1>=low && words[mid1] == "") mid1--;
while(mid2<=high && words[mid2] == "") mid2++;
int l = binary(words,s,low,mid1);
int r = binary(words,s,mid2,high);
if(l != -1)
{
return l;
}
else if(r != -1)
{
return r;
}
return -1;
}
else if(words[mid] > s)
{
high = mid-1;
}
else
{
low = mid + 1;
}
}
return -1;
}
};