【数据结构】 字符串模式匹配

模式匹配目前有两种方法: BF算法和KMP算法BF算法思路:从目标串的第一个字符和模式串的第一个字符开始,依次比较每个字符,如果相同指针同步后移比较后续字符,如果不同i指针后移一个,j指针回到第一个字符重新匹配,若匹配成功就返回模式串t中第一个字符在目标串中的位置,失败返回0代码:int index(Sqstring s,Sqstring t){ int i=j=1; //下标从1开始 while(i<=s.length&&j<=t...
摘要由CSDN通过智能技术生成

模式匹配目前有两种方法: BF算法和KMP算法

BF算法

思路:

从目标串的第一个字符和模式串的第一个字符开始,依次比较每个字符,如果相同指针同步后移比较后续字符,如果不同i指针后移一个,j指针回到第一个字符重新匹配,若匹配成功就返回模式串t中第一个字符在目标串中的位置,失败返回0

代码:

int index(Sqstring s,Sqstring t){
	int i=j=1;  //下标从1开始
	while(i<=s.length&&j<=t.length){  //在长度范围内 
		if(s.ch[i]==t.ch[j]){
			i++;    //指针同步后移 
			j++;
		}else{
			i=i-j+2;   //i指针后移一个(这里用这个公式会比较简单) 
			j=1;   //j指针回到第一个字符开始重新匹配 
		}
	} 
	if(j>t.length) return i-t.length;  //模式串超过长度了,说明匹配完了返回模式串的长度 
	else return 0;  //如果是目标串超过长度,说明目标串都遍历完了还没有匹配成功,则返回0表示失败 
}

这里如果你想让下标从0开始,就设i=j=0且后面公式改为i=i-j+1

若模式串长度为m,目标串长度为n,则直到匹配成功/匹配失败最多需要(n-m+1)*m次比较
最坏情况:每个子串的前m-1个字符都和模式串匹配,只有第m个字符不匹配
所以最坏时间复杂度: O(nm)
比较好的情况:每个子串的第1个字符就与模式串不匹配 

 

KMP算法

串的前缀:包含第一个字符,且不包含最后一个字符的子串

串的后缀:包含最后一个字符,且不包含第一个字符的子串

 

手算next数组:

雷打不动next[1]=0,next[2]=1

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值