KMP算法
KMP算法 文章讲的比较系统了。
next函数,这个文章有助于看懂next函数是怎么一回事。
适合所有场景,整体实现起来也比BM简单,O(n+m),仅需要一个next数组的O(n)额外空间;但统计意义下似乎BM更快,原因不明。
- 匹配失败时,总能够让pat回退到某个位置,而不是全部回退,而src不用回退。
- 在字符串比较时,pat提供的信息越多,计算复杂度越低。
最难理解的地方是
k = next[k]
因为前一个的最长串的下一个字符不与最后一个相等,需要找前一个的次长串,问题就变成了求0到next[k]的最长串,如果下个字符与最后一个不等,也就是下一个next[k],直到找到,或者完全没有。
Java代码
1 | package com.ludepeng.datastruct.base.datastruct.charMath.diffculty.kmp; |
总结
- getNext的代码并不难理解,但是由于 文字描述比较绕口,所以看文字很难一下子体会到,仍然建议使用单元测试来debug 调试跟踪内存,多打断点就能体会到妙处。
放上单元测试的代码
1 | package com.ludepeng.datastruct.base.datastruct.charMath.diffculty.kmp.demo; |
1 | package com.ludepeng.datastruct.base.datastruct.charMath.diffculty.kmp.demo; |