二分法变体,当查找到mid元素是空串时,同时向两边扩散寻找不为空串的索引作为mid,继续执行二分。
public class Solution {
public int search(String[] list, String str) {
if (list == null || list.length == 0 || str == null || str.isEmpty())
return -1;
return searchHelper(list, str, 0, list.length - 1);
}
private int searchHelper(String[] a, String s, int left, int right) {
while (left <= right) {
int mid = left + (right - left) / 2;
if (a[mid].length() == 0) {
int leftNear = mid - 1;
int rightNear = mid + 1;
while (true) {
if (leftNear < left && rightNear > right)
return -1;
if (leftNear >= left && a[leftNear].length() > 0) {
mid = leftNear;
break;
}
if (rightNear <= right && a[rightNear].length() > 0) {
mid = rightNear;
break;
}
leftNear--;
rightNear++;
}
}
if (a[mid].equals(s))
return mid;
else if (a[mid].compareTo(s) < 0) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
public static void main(String[] args) {
String[] stringList = { "apple", "", "", "banana", "", "", "", "carrot", "duck", "", "", "eel", "", "flower" };
System.out.println(new Solution().search(stringList, "carrot"));
}
}