字符串匹配——KMP算法

直接放代码

#include 
#include 
#include 
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<1<//输出b在a的起始位置 
            j=p[j];//找下一个,如果不再找直接break 
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/jz-597/p/11145317.html

你可能感兴趣的:(字符串匹配——KMP算法)