字符串匹配——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;
}