kmp算法 研究了两个午睡时间
分两步走
1.求needle的next数组
next数组最难理解
前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串。
后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。
然后找到这两个前缀后缀最长相同的部分
2.从头遍历haystack
// 方法一
class Solution {
public void getNext(int[] next, String s){
int j = -1;
next[0] = j;
for (int i = 1; i<s.length(); i++){
while(j>=0 && s.charAt(i) != s.charAt(j+1)){
j=next[j];
}
if(s.charAt(i)==s.charAt(j+1)){
j++;
}
next[i] = j;
}
}
public int strStr(String haystack, String needle) {
if(needle.length()==0){
return 0;
}
int[] next = new int[needle.length()];
getNext(next, needle);
int j = -1;
for(int i = 0; i<haystack.length();i++){
while(j>=0 && haystack.charAt(i) != needle.charAt(j+1)){
j = next[j];
}
if(haystack.charAt(i)==needle.charAt(j+1)){
j++;
}
if(j==needle.length()-1){
return (i-needle.length()+1);
}
}
return -1;
}
}
本文深入探讨了KMP算法,一种用于高效字符串匹配的算法。首先,详细解释了如何构建next数组,该数组用于记录字符串的最长公共前后缀,这是算法的关键步骤。接着,展示了如何遍历主串haystack,使用next数组来避免不必要的回溯,从而提高搜索效率。最后,提供了完整的Java实现代码,帮助读者理解并应用KMP算法。

被折叠的 条评论
为什么被折叠?



