KMP算法


KMP算法

求Next数组

vector<int> Next;
void GetNext(string s){
    cout<<s<<endl;
    int n = s.length();
    Next.resize(n+1);
    for (int i  = 0,j=Next[0]=-1;i<n;Next[++i]=++j ){
        while (~j &&  s[j]!=s[i]) {
            j= Next[j];
        }
    }

}

KMP

vector<int>  KMP(string text,string s){
    vector<int> ans;
    GetNext(s);
    int m = text.length(),n = s.length();
    for (int i = 0,j = 0;i<m;i++){
        while (j>0&&text[i]!=s[j]) j = Next[j];
        if(text[i]==s[j])++j;
        if(j==n) ans.push_back(i-n+1),j=Next[j]; 
    }
    return ans;
}

完整代码

#include <bits/stdc++.h>
using namespace std;

vector<int> Next;
void GetNext(string s){
    cout<<s<<endl;
    int n = s.length();
    Next.resize(n+1);
    for (int i  = 0,j=Next[0]=-1;i<n;Next[++i]=++j ){
        while (~j &&  s[j]!=s[i]) {
            j= Next[j];
        }
    }

}
vector<int>  KMP(string text,string s){
    vector<int> ans;
    GetNext(s);
    int m = text.length(),n = s.length();
    for (int i = 0,j = 0;i<m;i++){
        while (j>0&&text[i]!=s[j]) j = Next[j];
        if(text[i]==s[j])++j;
        if(j==n) ans.push_back(i-n+1),j=Next[j]; 
    }
    return ans;
}
int main(){
    string text = "bbbacbbbbabbab";
    string s = "bbbbab";
    cout<<KMP(text,s).size()<<endl;
    return 0;
}

文章作者: anlen123
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 anlen123 !
 上一篇
572. 另一个树的子树 572. 另一个树的子树
572. 另一个树的子树给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。 示例 1:给定的树 s: 3
2020-05-07 anlen123
下一篇 
83. 删除排序链表中的重复元素 83. 删除排序链表中的重复元素
83. 删除排序链表中的重复元素给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2示例 2: 输入: 1->1->2->3->3 输
2020-05-07 anlen123
  目录