kmp算法的理解与记忆


首先有两步,1求next数组,2进行比对。
我这种是数组后移的方法,即第一个数是-1。
步骤就是如果前后缀不相等,j就要后撤,要后撤因此要有范围。j>=0;
如果相等就j++;
每一次循环求出对应的next[i]。
要注意的点是因为我这是数组后移的方法,因此比较用next[j+1]比较。
2比对跟求next差不多
首先是对目标串进行遍历
不相等就后撤,相等就++;
当j==size()-1时,则匹配成功。

点击查看代码
class Solution {
public:
void getnext(int *next,const string&s){
    int j=-1;
    next[0]=j;
    for(int i=1;i<s.size();i++){
    while(j>=0&&s[i]!=s[j+1]){
        j=next[j];
    }
    if(s[i]==s[j+1]){
        ++j;
    }
    next[i]=j;
    }
}
    int strStr(string haystack, string needle) {
int next[needle.size()];
getnext(next,needle);
int j=-1;
for(int i=0;i<haystack.size();i++){
    while(j>=0&&haystack[i]!=needle[j+1]){
        j=next[j];
    }
    if(haystack[i]==needle[j+1]){
        ++j;
    }
    if(j==needle.size()-1){return i-needle.size()+1;}
}
return -1;
    }
};
posted @ 2024-01-14 09:00  yun-che  阅读(22)  评论(0)    收藏  举报