字符串匹配


字符串的存储结构:
线性表:包括顺序存储、链式存储

BF算法

是一种朴素的模式匹配算法。核心思想:
——有两个字符串S和T,长度为N和M。首先S[1]和T[1]比较,若相等,则比较S[2]和T[2],一直到T[M]为止;若S[1]和T[1]不等,则T向右移动一格字符的位置,再依次比较。
核心思想是回溯,效率较低。
在这里插入图片描述

KMP算法

核心是避免不必要的回溯。
思路一

在这里插入图片描述
思路二
在这里插入图片描述
思路三
在这里插入图片描述
思路四
在这里插入图片描述
考虑上述四种情况,形成KMP算法。
检查失配位置,比较失配位置前的子串,子串的前缀和后缀(长度均小于字串)匹配的个数为k,则失配位置在下一次要回溯比较的字符为原字符串的第k+1个字符(这里假设字符串从1开始计数,如果第一个字符就不匹配,则该位置下一次与第0个字符,即空字符作比较,也即字符串向右移动一位)
在这里插入图片描述
在这里插入图片描述
这里称k数组为next数组,加速信息,即数组 next 的提取是整个 KMP 算法中最核心的部分,求next数组的方法:
在这里插入图片描述

代码实现

//***********获得next数组的代码********
int j=0;
int i=1;
next[1]=0;
while (i<T[0])  // T[0] 用来记录整个字符串长度
{
	if (j==0 || T[i] == T[J])
	{
		i++;
		j++
		next(i)=j;
	}
	else
	{
	//回溯
		j = next(j);
	}
}

在这里插入图片描述
前缀是固定的,后缀是相对的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值