串模式匹配——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]算法时,我体会到了用画图法分析有助于直观地认识算法本质,这对于理解复杂想法作用极大。

猜你喜欢

转载自www.cnblogs.com/AUlikeHER32/p/10708266.html