Implement strStr().
Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
Example 1:
Input: haystack = "hello", needle = "ll" Output: 2
Example 2:
Input: haystack = "aaaaa", needle = "bba" Output: -1
思路:使用kmp匹配,目的是当模式串本身含有相同的部分结构时,使用额外的next数组记录下来,在匹配时加快模式串的滑动。
主要难点是next数组求解。
class Solution {
int[] getNext(String str){
int i = 0;//next数组的下标
int j = -1;//next数组的值
int[] next = new int[str.length()];
next[0] = -1;
while( i + 1< next.length){
if(j==-1||str.charAt(i)==str.charAt(j)){//遇到-1表示主串无法满足匹配,需要从下一位置开始
i++;
j++;
next[i] = j;
}else{
j = next[j];
}
}
return next;
}
public int strStr(String haystack, String needle) {
if(needle.equals("")) return 0;
if(haystack.equals("")) return -1;
int[] next = getNext(needle);
for(int x:next) System.out.println(x);
int i = 0;
int j = 0;
while(i < haystack.length() && j < needle.length()){
if(haystack.charAt(i)==needle.charAt(j)){
i++;
j++;
}else{
j = next[j];
if(j==-1){
i++;
j=0;
}
}
}
if( j == needle.length()) return i - needle.length();
else return -1;
}
}