常规解决主串中查找匹配的子串的问题是通过 朴素匹配算法,简单讲,就是通过比较主串和子串的第一个字符来查找,若主串和子串的第一个字符不相同,那么主串第二个字符和子串相比较,如若相同,主串和子串再比较下一个字符,以此类推,知道比较主串中找到连续的字符 与子串相同,则结束匹配。
KMP算法呢 主要通过一个next数组记录主串中每一个子序列中最长的共有元素长度值 如(借图)
- "A"的前缀和后缀都为空集,共有元素的长度为0;
- "AB"的前缀为[A],后缀为[B],共有元素的长度为0;
- "ABC"的前缀为[A, AB],后缀为[BC, C],共有元素的长度0;
- "ABCD"的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共有元素的长度为0;
- "ABCDA"的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共有元素为"A",长度为1;
- "ABCDAB"的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为"AB",长度为2;
- "ABCDABD"的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的长度为0。
如上,next记录部分匹配值,然后主串和子串比较时,如若主串一部分与子串相同,那么就跳过已经相同的部分,从主串与子串不同的部分开始比较,跳过过的位数可以通过next记录的部分匹配值来获得
移动位数 = 已匹配的字符数 - 对应的部分匹配值