The basic idea is binary search. But we have to modify it a little bit: when str[mid] is “”, we have to find a non empty string near to original one as the new str[mid]!
int search(vector<string>& str, string s, int lo, size_t hi){
if(lo>hi) return -1;
int mid = lo + (hi-lo)/2;
if (str[mid].empty()) {
int left = mid - 1;
int right = mid + 1;
while (true) {
if(left<lo && right > hi) return -1;
else if(right <= hi && !str[right].empty()){
mid = right;
break;
}else if(left>=lo && !str[left].empty()){
mid = left;
break;
}
++right;
--left;
}
}
if(s == str[mid]) return mid;
else if(str[mid] < s) return search(str, s, mid + 1, hi);
else return search(str, s, lo, mid - 1);
}
int searchStr(vector<string> str, string s){
if(str.empty() || s.empty()) return -1;
return search(str, s, 0, str.size() - 1);
}