串的模式匹配(c实现)

串的模式匹配(c实现)

KMP模式匹配的核心思想
省略一部分不必要的判断步骤(即去掉没必要的回溯步骤)

主串和匹配串分别的改变方式:
主串:是不会跳跃性改变,而只是会依次的递增比较下去
匹配串:根据匹配失败的串的后缀串与前缀串的匹配程度,从而确定回溯的位置

算法的实现:
分两块(两个函数):
First:一个能计算出匹配串中每一个位置匹配失败后,需回溯的位置的函数。
Second:一个能将匹配串和主串相比较匹配的函数。

KMP算法的重点考研考点: next数组
/*

	暂且跳过,待补充

*/

代码实现:

///KMP模式匹配算法实现
///计算出匹配串中每一个位置匹配失败后,需回溯的位置
///即生成next数组

void get_next(String T,int *next){
	int i,j;
	int i = 1;
	int j = 0;
	next[1] = 0;
	while(i<T[0])	//	此处的T[0]表示串T的长度
	{
		if(j==0||T[i]==T[j]){
			//T[i]表示后缀的单个字符
			//T[j]表示前缀的单个字符
			++i;
			++j;
			next[i] = j; 
		} 
		else	j = next[j];	//若字符不相同,则j回溯 
	} 
} 
 #define MAX 255
///KMP模式匹配算法实现
///计算出匹配串中每一个位置匹配失败后,需回溯的位置
///即生成next数组

void get_next(String T,int *next){
	int i,j;
	int i = 1;
	int j = 0;
	next[1] = 0;
	while(i<T[0])	//	此处的T[0]表示串T的长度
	{
		if(j==0||T[i]==T[j]){
			//T[i]表示后缀的单个字符
			//T[j]表示前缀的单个字符
			++i;
			++j;
			next[i] = j; 
		} 
		else	j = next[j];	//若字符不相同,则j回溯 
	} 
} 

///返回子串T在主串S中第pos个字符之后的位置。若不存在则返回0 
int Index_KMP(String s,String T,int pos){
	int i = pos;	//i用于表示主串S当前位置下的标值
	int j = 1;
	int next[MAX];	//定义一next数组
	get_next(T,next);	//得到next数组
	while(i<=s[0]&&j<=T[0]){
		if(j==0||s[i]==T[j]){
			++i;
			++j;
		}
		else{
			j = next[j];
		}
	} 
	if(j>T[0])	return i-T[0];
	else	return 0;
} 
 
发布了7 篇原创文章 · 获赞 6 · 访问量 164

猜你喜欢

转载自blog.csdn.net/qq_44972915/article/details/104163902
今日推荐