ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

串的两种模式匹配算法

2021-02-07 21:29:04  阅读:158  来源: 互联网

标签:子串 主串 两种 int ++ next 重复 算法 模式匹配


“静时亦觉意思好,才遇事便不同,如何?”
“是徒知静养而不用克己工夫也。如此,临事便要倾倒。人须在事上磨,方立得住,
方能‘静亦定,动亦定。’”
此时正宜用功。若此时放过,闲时讲学何用?人正要在此等时磨炼。

子串的定位操作:串的模式匹配

朴素的模式匹配算法

挨个遍历,例如在asdfghjkl中寻找dfg,需要将dfg与asdfghjkl从a~j依次进行比较,最坏结果时间复杂度很高(O(n-m+1)*m),非常低效。

KMP模式匹配算法

关键点:1.看子串中前后是否有重复出现的字符(更加概括地说是观察子串各元素的异同,结合主串进行分析,简化运算。

next值:分类讨论:j=1,next=0;若前缀和后缀有重复,重复n个,next=n+1;其他情况(无重复),next=1;
需要注意的点,取j值,要看j-1的重复情况,不是j字符串的重复情况。

代码实现

/*通过计算返回子串T的next数组*/
void get_next(String T,int *next)
{
	int i,j;
	i=1;//串后缀字符下标
	j=0;//串前缀字符下标
	next[1]=0;
	while (i<T[0])//T0是串长度 //T[i]是串后缀字符,T[j]是串前缀字符。
	{
		if(j==0||T[i]==T[j])
		{
			++i;
			++j;
			next[i]=j;
		}
		else
			j=next[j];
	}
}
/*返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0*/
/*T非空 。1<=pos<=Strlength(S)*/
//找出子串在主串中的位置
int Index_KMP(String S ,String T,int pos)
{
	int i=pos;//主串位置
	int j=1;//子串下标
	int next[255];//next 数组
	get_next(T,next);//调用函数。得到next数组
	while (i<=S[[0]&&j<=T[0])//主串没遍历完,子串没完
	{
		if (j==0||S[i]==T[i])//主串与子串字母相等,继续
		{
			++i;
			++j;	
		}
		else
		{
			j=next[j];//next函数已经根据重复情况为子串找好位置了,下次比较从next[j]位置开始
		}
	}
	if (j>T[0])//子串遍历完毕
		return i-T[0];
	else
		return 0;
}		

可以对KMP算法进行改进:nextval数组代替next数组,如果子串一位置后的元素和首元素的值一样,就可以用一位置元素next值代替之后元素next值。

下节:树

标签:子串,主串,两种,int,++,next,重复,算法,模式匹配
来源: https://blog.csdn.net/m0_46663240/article/details/113746545

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有