28. 实现 strStr()
最近双指针用的比较多,这道题就试着用双指针来解决一下
一个指针ph用于指向haystack,另一个pn指向needle
当ph和pn相同时,pn向前移动,否则pn重新回到needle头部
这里最主要的问题是:
字符串只匹配了前半部分时,如何处理,比如haystack为ababc,而needle为abc时。
此时ab是能够匹配的,但是当a!=c时如何处理是关键。
我一开始受限于上面的例子,试图让ph指向前一个元素,给当前这个没有匹配上的字符串再给依次机会,从这个字符串开始进行重新匹配,对于ababc这个例子是可行的,但是在第一个测试用例hello中找ll时,出现了问题:h!=l,ph重新指向了h,进入了死循环。
真正的做法是回到b,因为ab已经匹配失败了,我们需要的回到之前部分匹配成功的字符串的后一个字符串。比如abcabcd匹配abcd,abc匹配失败后,第二次应该从b开始。
那么第二次的位置该如何确定,就是当前指针位置(下标)-已经匹配上的字符串数量减一(needle中未匹配上的那个字符下标)+1
ababc匹配abc:2-2=1,即从第二个字符开始
abcabcd匹配abcd:3-3=1,即从第二个字符开始
mississippi匹配issipi:5-4+1=2,即从第三个字符开始
class Solution {
public int strStr(String haystack, String needle) {
if(haystack.equals(needle))
return 0;
if (needle.equals("") ) {
return 0;
}
char[] h_array = haystack.toCharArray();
char[] n_array = needle.toCharArray();
int j = 0;
int index = -1;
for (int i = 0; i < h_array.length; i++) {
if (h_array[i] == n_array[j]) {
index = i;
j++;
if (j >= n_array.length) {
break;
}
} else {
i=i-j;//这里没加一是因为循环i++了
j = 0;
}
if(i+1>=h_array.length&&j<=needle.length()-1)
return -1;
}
System.out.println(index);
return index == -1 ? -1 : index - needle.length() + 1;
}
}