数据结构学习笔记:(四)串

串的匹配

简单模式匹配

原理:两个指针,一个指向主串,一个指向子串,每次对比一个字符,相同后移,不同的化,主指针回溯(i-j+2),子串回到1的位置。
缺点:每次不匹配,主串就需要回溯到最开始的指定位置的下一位重新匹配,所以最坏时间复杂度为O(mn);

KMP算法

KMP算法是在匹配算法的基础上改进的。
原理:通过构建部分匹配数组,每次回溯,主串指针不需要回溯,子串根据部分匹配移动位置。
重点

  • 前后缀串:ababa’的前缀{a,ab,aba,abab}∩后缀(a,ba,aba,baba}={a,aba},公共元素有两个,最长相等前后缀长度为3。
  • PM,部分匹配
  • 求next[] 数组,求出每个子串对应的部分匹配值,为了方面计算,部分匹配值右移,首位补上-1,末尾丢弃这时候,j=next[j]+1。有时候,为了方面后面计算,会直接在数字上+1,直接j=next[j]
  • 手推next[]数组:在考试的时候,还是手推的方式比较方便,如果串的从1开始(不是从0开始),则第二位一定是1,也就是说next[1]=0,next[2]=1,向后推,第三位比较,只需要通过移动子串,判断后面移动之后,这时候j指向的位置就是next[3]的位置,依次类推。

缺陷:虽然只需要子串移动位置,但是移动之后,要比较的字符跟最开始比较的字符相同,所以这几次比较都是无效的。

注意

在实际 KMP 算法中,为了使公式更简洁、计算简单,如果串的位序是从1开始的,
则next 数组才需要整体加1;如果串的位序是从0开始的,则next 数组不需要整体加1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝多芬也爱敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值