KMP与最小覆盖子串
2014-07-14 16:44
218 查看
转载地址:
/article/10997612.html
我对KMP的一些理解(lyp点拨的):pre[i](或next[i])的实质是串str[1..i]的最长且小于i的“相等前、后缀”分别为str[1..pre[i]](前缀)与str[(i-pre[i]+1)..i](后缀),通俗讲就是:使str[1..i]前k个字母与后k个字母相等的最大k值。
KMP算法详解可见:/article/10997611.html
另外一个结论:
最小覆盖子串(串尾多一小段时,用前缀覆盖)长度为n-next
(n-pre
),n为串长。
证明分两部分:
1-长为n-next
的前缀必为覆盖子串。
当next
<n-next
时,如图a,长为next
的前缀A与长为next
的后缀B相等,故长为n-next
的前缀C必覆盖后缀B;
当next
>n-next
时,如图b,将原串X向后移n-next
个单位得到Y串,根据next的定义,知长为next
的后缀串A与长为前缀串B相等,X串中的长为n-next
的前缀C与Y串中的前缀D相等,而X串中的串E又与Y串中的D相等……可见X串中的长为n-next
的前缀C可覆盖全串。
2-长为n-next
的前缀是最短的。
如图c,串A是长为n-next
的前缀,串B是长为next
的后缀,假设存在长度小于n-next
的前缀C能覆盖全串,则将原串X截去前面一段C,得到新串Y,则Y必与原串长度大于next
的前缀相等,与next数组的定义(使str[1..i]前k个字母与后k个字母相等的最大k值。)矛盾。得证!有人问,为什么Y与原串长大于next
的前缀相等?由假设知原串的构成必为CCC……E(E为C的前缀),串Y的构成必为CC……E(比原串少一个C),懂了吧!
/article/10997612.html
我对KMP的一些理解(lyp点拨的):pre[i](或next[i])的实质是串str[1..i]的最长且小于i的“相等前、后缀”分别为str[1..pre[i]](前缀)与str[(i-pre[i]+1)..i](后缀),通俗讲就是:使str[1..i]前k个字母与后k个字母相等的最大k值。
KMP算法详解可见:/article/10997611.html
另外一个结论:
最小覆盖子串(串尾多一小段时,用前缀覆盖)长度为n-next
(n-pre
),n为串长。
证明分两部分:
1-长为n-next
的前缀必为覆盖子串。
当next
<n-next
时,如图a,长为next
的前缀A与长为next
的后缀B相等,故长为n-next
的前缀C必覆盖后缀B;
当next
>n-next
时,如图b,将原串X向后移n-next
个单位得到Y串,根据next的定义,知长为next
的后缀串A与长为前缀串B相等,X串中的长为n-next
的前缀C与Y串中的前缀D相等,而X串中的串E又与Y串中的D相等……可见X串中的长为n-next
的前缀C可覆盖全串。
2-长为n-next
的前缀是最短的。
如图c,串A是长为n-next
的前缀,串B是长为next
的后缀,假设存在长度小于n-next
的前缀C能覆盖全串,则将原串X截去前面一段C,得到新串Y,则Y必与原串长度大于next
的前缀相等,与next数组的定义(使str[1..i]前k个字母与后k个字母相等的最大k值。)矛盾。得证!有人问,为什么Y与原串长大于next
的前缀相等?由假设知原串的构成必为CCC……E(E为C的前缀),串Y的构成必为CC……E(比原串少一个C),懂了吧!
相关文章推荐
- POJ2185Milking Grid(最小覆盖子串 + 二维KMP)
- KMP与最小覆盖子串
- poj2185(二维最小覆盖子串问题-KMP)
- HDU 3746 Cyclic Nacklace(KMP最小覆盖子串)
- KMP(最长重复子串 & 最小覆盖)
- 最小覆盖子串 KMP
- KMP与最小覆盖子串
- 最小覆盖子串
- POJ--2158--------------Milking Grid(最小覆盖字符矩阵)---(开二维kmp)
- 最小覆盖子串
- poj 1961 Period (最小重复子串 kmp)
- KMP算法 - 求最小覆盖子串
- KMP算法 - 求最小覆盖子串
- 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185
- 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185
- [ZZ]最小覆盖子串算法
- HDU 3746 Cyclic Nacklace(KMP最小循环子串)
- [ZZ]最小覆盖子串算法
- 为什么KMP算法中n-next[n]的前缀为最小覆盖子串
- Hust oj 1758 Minimum Window Substring(最小覆盖子串问题)