KMP字符串匹配
来源:互联网 发布:python交换两个值 编辑:程序博客网 时间:2024/05/16 14:24
KMP匹配算法:
void GetNext(char *T){ int i=0,j=-1; next[0]=-1; int Tlen=strlen(T); while(i<Tlen) { if(j==-1||T[i]==T[j]) { i++; j++; if(T[i]!=T[j]) next[i]=j; else next[i]=next[j]; } else j=next[j]; }}bool KMP(char *S,char *T){ int i=0,j=0; GetNext(T); int Slen=strlen(S); int Tlen=strlen(T); while(i<Slen&&j<Tlen) { if(j==-1||S[i]==T[j]) { i++; j++; } else { j=next[j]; } } if(j>=Tlen) return true; else return false;}
next数组的意义:
当一个字符串以0为起始下标时,next[i]可以描述为"不为自身的最大首尾重复子串长度"。
也就是说,从模式串T[0...i-1]的第一个字符开始截取一段长度为m(m < i-1)子串,再截取模式串T[0...i-1]的最后m个
字符作为子串,如果这两个子串相等,则该串就是一个首尾重复子串。我们的目的就是要找出这个最大的m值。
next数组的应用:
POJ2406,给一个长度为1000000的字符串,求它由多少个最小的循环节组成,例如:ababab,它由3个ab组成,所以答案
是3,再比如abcdabcdab,它只能由一个abcdabcdab组成,所以答案是1.
关于最小的循环节,有一个重要的性质:tmp = len-next[len]为字符串str的最小循环节,且有:
IF len MOD tmp == 0 最小循环周期 ans = len MOD tmp;
ELSE 最小循环周期ans = 1;
注意在求循环节问题时的next数组不要优化,在做匹配时才优化。
那么POJ1961就很好做了,也是一样的求最小循环周期,题意是给一个长度为1000000的字符串,然后求它所有前缀的不为1的
最小循环周期。
POJ2752,题意:给一个字符串S,输出该字符串中既是前缀又是后缀的所有子串的长度,按照从小到大输出。
当然,我们用KMP可以这样做,先求next数组,然后next[len]就是除了S本身外满足条件的最长子串长度,然后我们按照它的
next数组往前跳就找到所有的了。
GetNext(str);int k=0,i = len;ans[0] = len;while(next[i] > 0){ i=next[i]; ans[++k] = i;}for(int i=k; i>0; i--) printf("%d ",ans[i]);printf("%d\n",ans[0]);
- KMP 字符串匹配算法
- kmp字符串匹配算法
- kmp字符串匹配算法
- KMP字符串匹配算法
- 字符串匹配算法-kmp
- KMP(字符串匹配)算法
- 字符串匹配 KMP
- KMP 字符串匹配算法
- 字符串匹配算法:KMP
- KMP算法 字符串匹配
- 字符串匹配 KMP 算法
- KMP字符串匹配(1)
- KMP字符串匹配(2)
- KMP字符串匹配(3)
- KMP字符串匹配算法
- KMP字符串匹配
- KMP字符串匹配算法
- KMP字符串匹配
- Intel8259A的初始化命令字
- 关掉和重启mysql进程
- 找出n个数组成的最长单调递增子序列( 动态规划O(nlogn) )
- KMP算法
- Drupal Views的帮助文档都有哪些?
- KMP字符串匹配
- HTTP学习总结-------1
- Android 在OnCreate()中获取控件高度与宽度
- ios 发送http协议请求消息
- Jquery动态增加行和删除行
- iOS应用的真机调试
- 11级_Java_曹建波6.07 MySQL语言结构
- Python编写FTP下载程序
- activity传参数与跳转