class Solution {
public int strStr(String haystack, String needle) {
if(needle.length()==0) return 0;
int []next = getNext(needle);
return KMP(haystack, needle, next);
}
public int KMP(String s, String p, int[] next){
int si = 0;
int pi = 0;
while(si<s.length() && pi<p.length()){
if(pi==-1 || s.charAt(si)==p.charAt(pi)){
si++;
pi++;
}
else pi = next[pi];
}
if(pi==p.length()) return si-pi;
return -1;
}
public int[] getNext(String str){
int n = str.length();
int next[] = new int[n];
next[0] = -1;
for(int i=1; i<n; i++){
next[i] = 0;
for(int k=next[i-1]; k!=-1; k=next[k]){
if(str.charAt(i-1)==str.charAt(k)){
next[i] = k+1;
break;
}
}
}
return next;
}
}
KMP模板
最新推荐文章于 2022-05-06 20:11:34 发布