#include<iostream>
using namespace std;
#include<cstring>
typedef struct
{
char ch[1000002] = {' '};
int length;
}sstring;//定义ADTsstring来表示字符串的性质
char temp[1000002]={' '};
void cinstring(sstring &s,char temp[]);//输入主串和模式串,实现字符串下标表示位置
void getnext(sstring t,int next[]);//实现模式串的回溯
int kmpcompare(sstring s, sstring t,int next[]);//使用KMP算法进行匹配,返回pos,通过pos的数值判断是否匹配成功
int main()
{
sstring s,t;
int flag=0;
cin>>temp;
cinstring(s,temp);
cin>>temp;
cinstring(t,temp);//分别读入主串和模式串
int next[t.length+1]={0};
getnext(t,next);
kmpcompare(s,t,next);
flag = kmpcompare(s,t,next);//用flag表示匹配成功后的位置或者匹配不成功的0;
cout<<flag;
}
void cinstring(sstring &s,char temp[])
{
s.ch[0] = ' ';
strcat(s.ch,temp);
s.length = strlen(s.ch)-1;
}
void getnext(sstring t, int next[])
{
int i=1,j=0;
next[1]=0;
while(i<t.length)
{
if(j==0||t.ch[i]==t.ch[j])
{
i++;
j++; //如果匹配相等,则继续扫描后续字符;
if(t.ch[i]!=t.ch[j]) next[i]==j;//
else next[i]==next[j];//
}
else
j = next[j];//若不匹配则模式串回溯
}
}
int kmpcompare(sstring s, sstring t,int next[])
{
int i=1,j=1,pos = 0;
while(i<=s.length&&j<=t.length)
{
if(j==0||s.ch[i]==t.ch[j])
{
i++;
j++;
} //匹配成功则继续比较后续字符
else j = next[j];//匹配不成功则模式串回溯
}
if(j>t.length)
pos = i-t.length;
return pos;
}
1.初步体会到了更优算法对数据量大的测试的重要作用。
2.一开始我将temp[1000002]定义在主函数内,结果不能运行,定义成全局变量之后问题迎刃而解。原因如何我已发邮箱问老师,知晓结果后再做总结。
3.在理解求next[j]算法时,我体会到了用画图法分析有助于直观地认识算法本质,这对于理解复杂想法作用极大。