文章目录
思路
【主串】ABABCABCACBAB
【模式串】ABCAC
【问题】如何在主串中找到模式串的位置?
(1)方法一:暴力
你能想到的,而且最简单的方法就是:用两层循环遍历两个串,直到完全相同,则返回位置(详细看本文内容:1 【方法一代码】暴力搜索
)
思考
- 方法一当然是最简单最暴力,但是最不省力最不省时间
- 但如果你自己运行几个例子,就会发现方法一中有非常非常多不必要的回溯!但是你又说不明道不清
- 而KMP就帮你归纳出了很多不必要回溯的情况(详细看本文内容:
2 哪些是不必要的回溯?
)
(2)方法二:KMP算法
避免不必要的回溯:主串指针i不回溯,模式串指针j只往前回溯一点。这非常nice,可以减少很多工作量
- KMP这么牛?那它是怎么避免没有必要的回溯?
详细看:3 KMP怎么避免没有必要的回溯(NEXT数组)
- NEXT数组怎么算?
避免回溯的核心是NEXT数组?那它是怎么算的?(详细看:4 如何求next数组?
) - KMP是怎么工作的?
有了NEXT数组以后,我们的匹配工作应该怎么来操作?(详细看本文5 KMP完整代码
) - KMP算法的改进
KMP算法已经很牛了