字符串匹配——KMP算法

直接放代码

#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;
}
posted @ 2017-02-22 19:49  jz_597  阅读(91)  评论(0编辑  收藏  举报