KMP

来源:互联网 发布:有声漫画软件排行 编辑:程序博客网 时间:2024/06/06 03:55
#include <algorithm>#include <iostream>#include<cstring>using namespace std;int next[30];void getnext(string T,int *next)//字符串T和next的脚标需要从1开始 {    int i=1;    next[1]=0;// 规定next数组第一位为0     int j=0;    while(i<T.length())    {        if(j==0||T[i]==T[j])        {            ++i;            ++j;            next[i]=j;        }        else            j=next[j];//回溯!!!     }}int vala(string S,string T,int *next){    int is=1,jt=1;    cout<<"S.L  "<<S.length()-1<<"  T.L "<<T.length()-1<<endl;     while(is<=S.length()&&jt<=T.length())    {          if(jt==0||S[is]==T[jt])          {               is++;               jt++;          }          else          jt=next[jt];        if(jt>T.length()-1)        return (is-T.length()+1);    }    return 0;}                           int main(){   // freopen("r","text.txt",stdin);    string Sstr;    cin>>Sstr;    Sstr="S"+Sstr;     string Tstr;    cin>>Tstr;    Tstr="T"+Tstr;     getnext(Tstr,next);    for(int i=0;i!=Tstr.length();i++)        cout<<Tstr[i]<<' ';    cout<<endl;    for(int i=0;i!=Tstr.length();i++)        cout<<next[i]<<' ';        cout<<endl;        cout<<vala(Sstr,Tstr,next);      system("pause");  return 0;}
0 0