kmp算法

374 阅读1分钟

kmp算法是在一个字符串text中查找目标字符串p是否出现过的算法。
这个算法的关键是字符匹配表。每次碰到不匹配的字符, 都用已经匹配了的
字符串s的长度减去s的部分匹配值。s的部分匹配值就是s的前缀子串和s的后缀子串中相等的长度最长的那一对子串中的任一个的长度。s的长度减s的部分匹配值的实质就是我已经直到已匹配字符串中后面有一部分跟前面有一部分是匹配的,也就是text中现在匹配部分的后部分有一部分跟目标字符串p前面一部分匹配,匹配的长度就是部分匹配值。那么要我移动多少位呢?当然是直接把p移动到第一个字母跟后缀数组里面最长的那个子串的第一个字母所在的位置上了。那么为什么选最长的呢?因为p要尽可能从前面开始匹配, 选较短的可能会漏掉能匹配的机会。

kmp算法关键是求next数组

怎么求呢? 利用前一个next值求, 能够延长就延长,不能延长就缩短。因为前缀数组和后缀数组都有连续性,都可以利用已经记录了的前缀数组。