KMP算法是Knuth-Morris-Pratt算法的简称,它主要用于解决在一个长字符串S中匹配一个较短字符串s。
首先我们从整体来把我这个算法的思想。
字符串匹配的朴素算法:
我们容易想到朴素算法,即对于目标字符串s和检索对象字符串S,有如下的匹配流程。
while(没有完成匹配)
{
index_S++
temp = index_S
for index_s ,1 to strlen(s)
{
if(s[intdex_s] != S[temp]) break;
else temp++;
}
}
而KMP算法优化朴素算法的精髓,就是在index_S++这一部分。
我们设想,在for中我们正在进行一次匹配,此时已经完成了长度为index_s的匹配,但是在index_s + 1的时候不再满足条件。
首先我们假设长度为index_s的字符串没有字符相同,那么显然,index_S++能够完成index_s次。
其次我们考虑如果已经匹配的index_s的字符串中所有后缀和所有前缀有交集,那么我们如果依然进行上一段的操作会存在漏掉某种匹配情况的危险,因此我们要合理的避免这种危险的发生,即index_S++需要进行index_s - common次,其中common表示已完成匹配的长度index_s的字符串的前缀和后缀的交集中,最长的字符串的长度(有些拗口,需要充分理解)。
这就是KMP的基本思想或者是其正确性的阐述。