朴素算法的思想最好理解当相同时往后匹配,不同时就再从第一个开始重新匹配,对于无规则乱序还可以,但是如果主串为“abacba”,模式串中如“abab”,我们可以发现当abab后一个匹配失败时朴素算法需要重新从主串的第二个“b”开始与匹配串重新比较,但是KMP就改进了这个缺点,我们已经知道了两个串前三个一样,那为什么不从主串的c与匹配串的第一个b比较,那主串的c就是主串匹配失败的位置,匹配串就是匹配失败时当前位置的前一个的真子串长度,因为匹配失败前都已经匹配成功,而只要知道前面的真子串长度。因为是从0开始记录所以就是真子串的长度而不用加一。
所以我们大概了解了KMP算法:如果当前字符匹配成功就两个都往后移,如果失败,主串位置不变,匹配串返回当前位置前(不含当前字符)真子串的长度。
失效函数也就是求返回当前位置前(不含当前字符)真子串的长度,那么也可以看成是同样使用KMP算法来求。我们令第1个f[0]的为-1
void GetFailure(const String &pat, int f[])
//求匹配串pat的失效函数值
{
f[0]=-1; // 初始f[0]的值为-1