串的模式匹配算法-KMP算法

最简单的算法就不说了,直接上KMP,时间复杂度是 O(n+m)。

1.next数组

串的模式匹配算法-KMP算法

2.kmp过程

这一段和next数组的构建很相似。

#include<iostream>
#include<cstring>
using namespace std;
int next[105];
void next_int(string t){
    int lent=t.length();
    int j=1,i=0;
    while(j<lent)
            (t[j]==t[i])?(next[j+1]=++i,j++):((i==0)?(next[++j]=0):i=next[i]);
//    for(int i=0;i<lent;i++){
//        cout<<next[i];
//    }
}
int kmp(string s,string t){
    int lens=s.length(),lent=t.length();
    int i=0,j=0;
    while(i<lens){
        (t[j]==s[i])?(j++,i++):((j==0)?(i++):j=next[j]);
        if(j==lent) return i-lent+1;
    }
}
int main(){
    string s,t;
    cin>>s>>t;
    next_int(t);
    int i=kmp(s,t);
    cout<<i<<endl;
    return 0;
}