KMP(最长重复子串 & 最小覆盖)
来源:互联网 发布:2016nba数据库排名 编辑:程序博客网 时间:2024/05/26 19:16
转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents
如果一个长度 L 字符串是由 n 个长度 L / n 子串构成的。那么最后一个字符的next值是L-L/n吧;
例如:
一个字符串:abbabbabbabbabb(一共15个字符)
next[15]=12吧!
我们拿:15 - 12 = 3 就是最长重复子串的长度
现在说一般情况:
假设 next[length] = k
如果 k % length == 0 那 length / k 就是最长重复子串长度;
如果 k 不能整除 length 那最长重复子串就是它自己了。
KMP,next[]表示模式串如果第i位(设T[0]为第0位)与文本串第j位不匹配,则要回到第next[i]位继续与文本串第j位匹配。则模式串第1位到next[n]与模式串第n-next[n]位到n位是匹配的。所以思路和上面一样,如果n%(n-next[n])==0,则存在重复连续子串,长度为n-next[n]。
例如: a b a b a b
next: -1 0 0 1 2 3 4
next[n] == 4代表着:前缀abab与后缀abab相等的最长长度,这说明,ab这两个字母为一个循环节,长度 = n-next[n];
求next[]值的代码如下:
#include<cstdio>#include<cstring>#define N 1000017int next[N];int len;void getnext(char T[]){ int i = 0, j = -1; next[0] = -1; while(i < len) { if(j == -1 || T[i] == T[j]) { i++; j++; next[i] = j; } else j = next[j]; }}int main(){ char s[N]; while(~scanf("%s",s)) { len = strlen(s); getnext(s); for(int i = 1; i <= len; i++) { printf("%d ",next[i]); } printf("\n"); } return 0;}
实例运用见:http://blog.csdn.net/u012860063/article/details/38532507
4 0
- KMP(最长重复子串 & 最小覆盖)
- 最小覆盖子串 KMP
- poj2185(二维最小覆盖子串问题-KMP)
- HDU 3746 Cyclic Nacklace(KMP最小覆盖子串)
- KMP与最小覆盖子串
- KMP与最小覆盖子串
- KMP与最小覆盖子串
- POJ 1961(KMP前缀最长重复子串)
- poj2406 kmp 最小重复子串
- KMP求最小重复子串的重复次数(poj2406)
- POJ2185 Milking Grid 最小覆盖子矩阵(二维KMP)
- KMP求最小覆盖子矩阵
- poj 1961 Period (最小重复子串 kmp)
- KMP数组之应用之 最长重复子串的求取(不太好形容)
- 最小覆盖子串
- 最小子串覆盖
- 最小覆盖子串
- 最小子串覆盖
- JSVM中配置文件介绍以及如何配出各种可分级
- BIOS启动过程
- LoadRunner11 下载 及 license注册
- JAVA反射机制
- 常用命令
- KMP(最长重复子串 & 最小覆盖)
- 【ThinkPHP学习】数据库设计相关问题
- poj 2155 二进制0 1反转---二维树状数组
- Qt初级:基于拖放操作和文件流操作的文件转换小助手
- java多线程中的异常处理 - 异常处理在多线程中的原则
- Cocos3.0数据结构Value Map Vector
- CATransition
- spark应用程序的运行架构
- deep_c++:构造函数——1