> 文章列表 > 4.2.2字符串KMP算法

4.2.2字符串KMP算法

4.2.2字符串KMP算法

 

 对朴素模式匹配算法的优化:

 

 

 当我们匹配最后一个字符才发现匹配失败。

那么前面这些字符一定是与模式串对应的。

 通过模式串的部分匹配

 

朴素模式匹配算法优化思路:

 不匹配的字符之前,一定是和模式串一致的。

 可以跳过中间好几个没有必要的对比

前面5个已知字符中我们已知ab当i=4和i=5时。

 我们得到的结论并不依赖于主串,只与模式串有关。

 前面这几个字符肯定是与模式串匹配的。

 

 

 

 当第五个元素匹配失败后,主串指针i保持不变,模式串指针j=2

那如果第4个元素匹配失败呢?
主串指针i保持不变,模式串指针j=2

 可令主串指针i不变,模式串指针j=1

 

 

 

 IN CONCLUSION

 

 现在呢,我们知道当第六个元素匹配失败,可令主串指针i不变,模式串指针j=3。

那我们接下来改一下例子哈

 我们发现第5个元素匹配失败,那接下来令主串指针i不变,模式串指针j=2。

 我们发现第2个元素发生失配,令主串指针i不变,模式串指针j=1.

 第一个元素匹配失败,匹配下一个相邻字串,令j=0,i++,j++

 中间省略,与上述相同。if

 

 

此时j超过了模式串的匹配范围而停止。

 

 这个算法指对模式串T="abaabc"生效

第i个元素匹配失效,next[i]

模式串指针的数值由next数组存储。

 这就是KMP算法

特殊情况下,if(j==0){i++;j++}

process:

(1)根据模式串T,求出next数组。

(2)利用next数组进行匹配(主串指针不回溯)

 传入主串S,模式串T,以及与模式串相关的next数组。

我们来进行一个对比

改变的只是我们圈起来的部分。