关于KMP算法的初步理解

查找字符串匹配的算法

1.next[i]数组,这里是对匹配串设置的一个数组,作用是能快速移动到不必重复移动的位置,意思是下标为i的字符前面(不包括i)的字符串中最大前缀和后缀重复的个数。首先要初始化一个next[0],因为0前面没有数,所以我们假设next[0]=-1,(-1就相当于无意义吧!)

下面就是next数组的核心代码:

void getnext(string s)
{
   	int j=0,k=-1;
   	next[0]=-1;
   	while(j<s.size())    //这个才是求的前面重复的最长距离 
   	{  //cout<<j<<endl;
   	   if(s[k]==s[j]||k==-1 )
		 next[++j]=++k;
	   else	
   		 k=next[k];
	}
	return;
}

我们可以看到当k=-1,j=0时很容易得到next[1]=0;表示下标为1的字符前面有0个重复的前后缀,当j>=1时就一直作比较。
这里一定要注意的是next[i]保存的是不包括i字符前字符串的最大重复的前后缀。这里的k=next[k]有一种递归的思想。
在这里插入图片描述
核心就是next的求法了,最后很简单的就得出了KMP算法

int KMP(string s,string t)
{
	int i=0,j=0; //表示从原串和匹配串的头开始找
	getnext(t);
	while(i<s.length()&&j<t.length())
	{
		if(j==-1||s[i]==t[j])
		{
			j++;
			i++;
		}
		else
		 j=next[j];
	}
	if(j>=t.length())
	 return (i-t.length()); //返回下标
	else 
	  return -1; //表示没有找到
}

正确代码

int KMP(string s,string t)
{
	int i=0;
	int j=0;
	getnext(t);
	int len2=t.size();
	printf("slength:%d tlength:%d\n",s.length(),len2);
	while(i<s.size()&&(j<len2))   //这里的陷阱 
	{  
		if(j==-1||s[i]==t[j])
		{   
			++i;
		    ++j;
		}
		else
		  j=next[j];
	}
	if(j>=t.length())
	 return (i-t.length());
	else 
	  return -1;
}

第一个代码是最开始的代码,但经过多次调试都只进行一次循环,最后发现了一个大坑,最开始我用j和string类型的t.size()比较,j是int类型的,可是t.size()返回的是unsigned类型的,比较的结果竟然是负数比正数还大,最后让一个int类型的len2=t.size()才得到正确的答案.在用比较运算符的时候,一定要注意前后数据类型是否一致!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的高校科研信息管理系统实现了操作日志管理、字典管理、反馈管理、公告管理、科研成果管理、科研项目管理、通知管理、学术活动管理、学院部门管理、科研人员管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让高校科研信息管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值