【问题描述】
KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置。
【输入形式】
3组字符串,每组字符串占一行。每行包含由空格分隔的两个字符串,字符串仅由英文小写字母组成且长度不大于100。
【输出形式】
每组数据输出1行,输出后一个字符串在前一个字符串中的位置,如果不匹配,则输出0。
【样例输入】
string str
thisisalongstring isa
nosubstring subt
【样例输出】
1
5
0
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int i;
for(i=0;i<3;i++){
string a;
string b;
cin>>a>>b;//getline(cin,str)的方式在这里不符合
const int m=a.size();
const int n=b.size();
int next[m];
next[0]=-1;
int k=-1;
int j=0;
while(j<m-1){
if(k==-1||a[j]==a[k]){
next[++j]=++k;
}
else{
k=next[k];
}
}
int q=0,w=0;
while(q<m&&w<n){
if(w==-1){
q++;w=0;
}
else if(b[w]==a[q]){ w++;q++;}
else w=next[w];
}
if (w<n) cout<<0<<endl;
else cout<<q-w+1<<endl;}
return 0;