数据结构---KMP算法(2)

0.简介

KMP中有个next数组,我们从这里逐渐引出KMP算法原理。

1.最长公共前后缀

我们先看最长公共前后缀问题,给定一个字符串s,s为abcdabcd,问这个字符串的最长公共前后最是什么,我们能一眼就看出是abcd,因为abcd.....,和.....abcd,这样一来,就找到了。现在好好理解一下这个找最长公共前后缀问题。

首先,这是一个动态规划问题。假如当前字符串长度为n,那么当长度为n的时候,最长公共前后缀m是什么,取决于长度是n-1时候最长公共前后缀k是多少和第n个字符是否与第k+1个字符相等。如下图。dp[i]为到i为止,最长公共前后缀的长度。

数据结构---KMP算法(2)_第1张图片

 

上面的是一种情况,假如s[i]与s[dp[i-1]+1]不相等的时候呢。如下图

数据结构---KMP算法(2)_第2张图片

此时s[i]与s[dp[i-1]+1]不相等,我们就不能直接利用dp[i-1]的结果了。

数据结构---KMP算法(2)_第3张图片

但是怎么找开头与后面这段那个位置能最长匹配,从倒数第四个b开始挨个和字符串开头匹配?可以,但是不好。

不难发现,字符串后面的abab和开头的abab是一样的,此时问题就变成了求abab在填一个a变成ababa的最长公共前后缀,abab的最长公共前后缀已经在前面求过了,直接拿来结果就好了。也就是看dp[dp[i-1]]的值和s[dp[dp[i-1]]+1]是否与s[i]相等。如下图

数据结构---KMP算法(2)_第4张图片

如果还不相等,继续以此类推,直到无法计算,或者是相等为止。

你可能感兴趣的:(算法。动态规划,数据结构与算法)