串的模式匹配,KMP算法(解释+源码)
解释大部分是直接copy《王道数据结构》
还有一些是自己总结的,可能有些不太对,还请大家指出
KMP算法
关键点:后移多少位,取决于最长的公共前缀和后缀。
例如:abcabcd
a --> 0
ab --> 0
abc --> a/ab c/bc --> 0
abca --> a/ab/abc a/ca/bca --> 1
abcab --> a/ab/abc/abca b/ab/cab/bcab --> 2
abcabc --> a/ab/abc/abca/abcab c/bc/abc/cabc/bcabc -->3
abcabcd --> a/ab/abc/abca/abcab/abcabc d/cd/bcd/abcd/cabcd/bcabcd --> 0
在实际匹配过程中,子串在内存里是不会移动的,而是指针在变化,书中画图举例只是为了让问题描述得更加形象。
若子串j==0时:子串的第j个字符和主串的第i个字符不等时,则主串应从i+1个字符继续与子串的第j个字符进行比较。
若子串j!=0时:子串的第j个字符与主串第i个字符发生失配时,则跳到子串的next[j-1](即前一个元素的部分匹配值)位置重新与主串第i个字符位置进行比较。