码迷,mamicode.com
首页 > 编程语言 > 详细

串模式匹配——KMP算法

时间:2019-04-15 00:25:35      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:string   def   type   next   全局   数据量   cat   flag   ==   

#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算法

标签:string   def   type   next   全局   数据量   cat   flag   ==   

原文地址:https://www.cnblogs.com/AUlikeHER32/p/10708266.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!