问题
有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?
主串:BBC ABCDAB ABCDABCDABDE 模式串:ABCDABD
解法1-BF暴力求解
即遍历两个数组,一一对比,如果不匹配,就后移一位重新遍历
缺点:时间复杂度高
解法2-hash
- 将模式串进行hash
- 主串取模式串长度进行hash,遍历对比
- 如果hash值相等,取出对应串
- 将对应串和模式串再对比一次,防止hash冲突
解法3-KMP算法
核心:找到模式串中重复的子串,减少遍历的次数;
eg:在上面题目中当遍历到D时不匹配
BBC ABCDAB ABCDABCDABDE
ABCDABD
正常情况会后移一位再遍历,但是这样就和BF算法没有区别了。
已知空格与D不匹配时,前面六个字符"ABCDAB"是匹配的。查表可知,最后一个匹配字符B对应的"部分匹配值"为2,因此按照下面的公式算出向后移动的位数:
移动位数 = 已匹配的字符数 - 对应的部分匹配值
//因为 6 - 2 等于4,所以将搜索词向后移动4位
BBC ABCDAB ABCDABCDABDE
ABCDABD
- 求 next数组
- 图解
-
模式串中没有重复字符
-
模式串中有重复字符
参考 字符串匹配的KMP算法