数据结构与算法——串与kmp算法

数据结构与算法——串与kmp算法

KMP算法

首先要明确kmp算法中next数组的作用:记录的是模式串下一次应该与主串进行匹配的下标,不是模式串应该移动的距离。

在描述kmp算法时为了形象,将提高算法效率的方法说成:不让主串的指针回溯,将模式串“ 滑动 ” 尽可能的距离后,继续进行比较。这里的滑动是加了引号的滑动,实际是指针指向数组下标的更换。

next【j】(注意到了吗,next数组中填放的是模式串的指针,next【 j 】存放的是下一次要与主串比较下标元素,下标就是next【 j 】这次要求的内容,(等于说上一次求了,下一次就用)next【】数组的求法要以 j 指针的数值为铺垫)数组的求法:

求法:

next【 j 】= 0 , 当 j == 1 时,也就是指向模式串中的第一个元素

next【 j 】= L(max)+ 1,L(max)是匹配过的子串中最大相等前后缀的长度

next【 j 】= 1 , 当匹配过的字串没有最大相等前后缀时


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fRpxavrB-1636556238457)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211021214435142.png)]

就像这一题:

模式串的指针我们默认为 j 。

1、j 指向 a ,a是模式串中的第一个元素,所以为 0

2、j 指向 b ,前面只有 a ,没有最大相等前后缀,所以为 1

3、j 指向 a ,前面匹配过的子串是 ab , 没有最大相等前后缀 ,所以next数组中的数为 1

4、j 指向 b ,前面匹配过的子串是 aba , 最大相等前后缀为 1 ,所以next数组中的数为 2

5、j 指向 a ,前面匹配过的子串是 abab ,最大相等前后缀为 2 ,所以next数组中的数为 3

6、j 指向 b ,前面匹配过的子串是ababa ,最大相等前后缀为 3 ,所以next数组中的数为 4

7、j 指向 a ,前面匹配过的子串是ababab , 最大相等前后缀为 4 ,所以next数组中的数为 5

8、j 指向 a ,前面匹配过的子串是abababa ,最大相等前后缀为 5 ,所以next数组中的数为 6

9、j 指向 b ,前面匹配过的子串是abababaa , 最大相等前后缀为 1 ,所以next数组中的数为 2

所以next【 j 】数组为 0 1 1 2 3 4 5 6 2

到此依靠人脑next数组中数值的判断已经没问题了


接下来就是让计算机知道怎么求解next数组中的值了

也就是编程求得next数组的函数值(也是最难的 呜呜呜呜)

(2条消息) Round10—串_你倒是敲代码鸭.-CSDN博客

先插入一个有些新意和代表性的kmp算法编程题


pta错题集

kmp算法中要知道next【i】取值的依据然后才能进行模式匹配

next【i】数组的求解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ml9mEh2b-1636556173275)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211021102400925.png)]

8+7+6+5+4+3+2+1+1(空串)

= 37

猜你喜欢

转载自blog.csdn.net/ahahayaa/article/details/121258844