KMP 总体思想 同暴力基本一致。
KMP和暴力的区别在于 KMP在匹配失败后 不是向后移一位,而是向后移动若干位
怎么算具体移动多少位呢? 用下面的一个公式来算:
移动位数=已经匹配的位数-对应的部分匹配值
那么现在就剩下对应的部分匹配值怎么计算的问题了。 部分匹配值 就是 要查找的那个子串的前缀和后缀的公共串的长度。
部分匹配的实质就是 串的 首位 会有重复的地方 我们移动的时候直接 把头移动到和尾 重复的那部分即可 中间的部分不需要在比较。
比如部分匹配串“ABCDEFABC” 手尾的ABC是重复的 那么下次移动就把头部的A直接移动到尾部的那个ABC 那里 而不需要移动到开头的B哪里。。