1. 算法思路介绍
1. 题目描述
有一个文本串aabaabaaf
有一个模式串aabaaf
返回完全匹配的第一个下标
- 按照传统匹配模式来,那么暴力两重循环遍历
- 如果按照kmp模式,当匹配到冲突的字符时,找冲突字符前面的字符串的最长相等前后缀
2. 前后缀和前缀表
-
什么是前缀:包含首字母,不包含尾字母的所有子串
-
什么是后缀:包含尾字母,不包含首字母的所有子串
eg:aabaa
-
前缀:a aa aab aaba
-
后缀 a aa baa abaa(注意这个baa,虽然是后缀,但是顺序还是从前往后排,你不要按照惯性思维从后往前排成aab了,就离谱了)
-
他们的最长前后缀是aa
-
-
什么是前缀表,就是每一个子串的最长相等前后缀
eg:aabaaf的前缀表就是0,1,0,1,2,0
-
如何用前缀表进行模式匹配
-
(1)找到发生冲突的位置之后(本例子是S(b),T(f))
-
(2)找到发生冲突的字符之前的字符串的最长前后缀
-
(3)把T的匹配指针移动到前缀的后一个字符(b),S的匹配指针还是原来的哪个发生冲突的字符(b),可以发现,b的下标其实也就是最长相等前后缀的长度,接着下一步匹配
可以看1的图解
-
3. 求前缀表next数组
这个最关键也最难理解!贴上知乎链接https://www.zhihu.com/question/21923021