串模式匹配——KMP算法
Posted aulikeher32
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了串模式匹配——KMP算法相关的知识,希望对你有一定的参考价值。
#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]算法时,我体会到了用画图法分析有助于直观地认识算法本质,这对于理解复杂想法作用极大。
以上是关于串模式匹配——KMP算法的主要内容,如果未能解决你的问题,请参考以下文章