字符串匹配——KMP算法

来源:互联网 发布:phpmyadmin删除数据库 编辑:程序博客网 时间:2024/04/29 23:53

直接放代码

#include <iostream>#include <cstring>#include <cmath>using namespace std;int main()//注意!我是一个C++的新手,用C风格字符串,我还让字符串下标看起来是从1开始,更好看一点 {    int i {},j {};    char a[101] {},b[101] {};    int p[101] {};//其实我也不熟悉它的定义,反正p[i]可以简单理解为在b[i]取一个b[p[i]],使得b[i]=b[p[i]]     cin>>a+1;    cin>>b+1;    int n=strlen(a+1),m=strlen(b+1);//n表示a的长度,m表示b的长度     j=0;    p[1]=0;//p[1]前面没有东西,当然是0了!     for(i=2;i<=m;i++)    {        while ((j>0)&&(b[j+1]!=b[i])) j=p[j];//找一个满足b[j+1]==b[i]的j         if (b[j+1]==b[i]) j++;//变成了b[j]==b[i],使得这一位可以匹配         p[i]=j;//又变成了b[p[i]]==b[i],满足p的定义     }    j=0;    for(i=1;i<=n;i++)    {        while ((j>0)&&(b[j+1]!=a[i])) j=p[j];//找一个满足b[j+1]==a[i]的j        if (b[j+1]==a[i]) j++;//变成b[j]=a[i],使得这一位可以匹配         if (j==m)//即是b匹配完了         {            cout<<i-m+1<<endl;//输出b在a的起始位置             j=p[j];//找下一个,如果不再找直接break         }    }    return 0;}
0 0