算法导论-第32章- 字符串匹配 - KMP算法

博客详细介绍了《算法导论》中关于字符串匹配的四种方法,重点讲解了KMP算法。通过举例说明,解释了如何在文本串S与模式串P中应用KMP算法避免不必要的字符比较,优化匹配过程。

书中依次讲了4种方法,朴素算法、RabinKarp算法、有限自动机算法、KMP算法

1、朴素算法:

算法用一个循环来找出所有有效位移,该循环对n-m+1个可能的每一个s值检查条件P[1...m] = T[s+1....s+m];

//朴素的字符串匹配算法
void nativeStringMatcher(string st, string sp)
{
	int n = st.length();          //主串长度
	int m = sp.length();          //模式串长度

	for (int s = 0; s <= n-m+1; s++)
	{
		string ss = st.substr(s, m);   //ss为st从s位置开始的m个字符,即和sp比较的字符串
		if (sp == ss)
			cout << "在位置" << s << "处发现匹配" << endl;
	}
}

上面函数调用了string比较是否相等的操作,如果不用这样比较,即一个字符一个字符比较,则有暴力枚举法如下:

int ViolentMatch(char* s, char* p)  
{  
	int sLen = strlen(s);  
	int pLen = strlen(p);  

	int i = 0;  
	int j = 0;  
	while (i < sLen && j < pLen)  
	{  
		if (s[i] == p[j])  
		{  
			//①如果当前字符匹配成功(即S[i] == P[j]),则i++,j++      
			i++;  
			j++;  
		}  
		else  
		{  
			//②如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0 即j回到0,i回到i-j+1处重新比较,下面介绍的KMP算法的不同就在于i不会回到i-j+1,而j也不一定非要回到0比较     
			i = i - j + 1;  
			j = 0;  
		}  
	}  
	//匹配成功,返回模式串p在文本串s中的位置,否则返回-1  
	if (j == pLen)  
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值