【问题描述】KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置。
【输入形式】3组字符串,每组字符串占一行。每行包含由空格分隔的两个字符串,字符串仅由英文小写字母组成且长度不大于100。
【输出形式】每组数据输出1行,输出后一个字符串在前一个字符串中的位置,如果不匹配,则输出0。
【样例输入】
string str
thisisalongstring isa
nosubstring subt
【样例输出】
1
5
0
【提示】表示字符串的数据结构可以是字符数组或用串类实现。KMP算法调用很简单,但难的是理解算法的思想。掌握算法的思想才能说是掌握算法。
代码实现
#include<iostream>
#include<string>
#define maxsize 200
using namespace std;
struct lsystring
{
char data[maxsize];
int len;
};
void getnext(lsystring lsy,int next[])
{
int j=0,k=-1;
next[0]=-1;
while(j<lsy.len-1)
{
if(k==-1||lsy.data[j]==lsy.data[k])
{
j++;k++;
next[j]=k;
}
else
{
k=next[k];
}
}
}
void KMPindex(lsystring lsy1,lsystring lsy2)
{
int next[maxsize],i=0,j=0;
getnext(lsy2,next);
while(i<lsy1.len&&j<lsy2.len)
{
if(j==-1||lsy1.data[i]==lsy2.data[j])
{
i++;j++;
}
else j=next[j];
}
if(j>=lsy2.len)
cout<<i-lsy2.len+1<<endl;
else
cout<<"0"<<endl;
}
int main()
{
lsystring lsy1,lsy2;
string s1,s2;
while(cin>>s1>>s2)
{
lsy1.len=s1.length();
lsy2.len=s2.length();
s1.copy(lsy1.data,lsy1.len,0);
*(lsy1.data+lsy1.len)='\0';
s2.copy(lsy2.data,lsy2.len,0);
*(lsy2.data+lsy2.len)='\0';
KMPindex(lsy1,lsy2);
}
return 0;
}
KMP算法详解请看:数据结构KMP算法配图详解(超详细)_哈顿之光的博客-CSDN博客_数据结构kmp算法
强推这篇文章,讲解细致,图片直观,通俗易懂。