编程珠玑 用后缀数组求字符串的最大重复子串
来源:互联网 发布:淘宝主营在哪里看 编辑:程序博客网 时间:2024/05/29 18:03
这是在编程珠玑上介绍的一种求字符串的最大重复子串,用的是后缀数组实现的。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 5000000;char C[MAXN];char* A[MAXN];/*后缀数组:字符串banana的后缀数组为:未排序:banana, anana, nana, ana, na, a已排序:a, ana, anana, banana, na, nana思考:为什么用后缀数组就可以求出字符串的最大重复子串???????*/int cmp(char *a, char *b) { return strcmp(a, b)<0;//不是return strcmp(a, b);因为sort只接受0值和非0值,所以strcmp的返回值-1和1均当作一样看待}int comlen(char *a, char *b) { int len = 0; while(*a && *b) { if(*a == *b) { len++; a++; b++; } else { break; } } return len;}int main(){ int i, n = 0; char ch; while((ch = getchar()) != EOF) {//ubuntu下以ctrl+D结束 A[n] = &C[n];//后缀数组 C[n++] = ch; } C[n] = '\0'; //for(i=0; i<n; i++) printf("%s\t", A[i]); sort(A, (A+n), cmp); //for(i=0; i<n; i++) printf("%s\t", A[i]); int maxL = -1; int pos = -1; for(i=1; i<n; i++) { int len = comlen(A[i-1], A[i]); if(maxL < len) { maxL = len; pos = i; } } printf("%.*s\n",maxL,A[pos]); return 0;}
- 编程珠玑 用后缀数组求字符串的最大重复子串
- 【编程珠玑】第十五章--字符串:用后缀数组查找最长不重叠的重复子串
- 后缀数组求最大重复子串
- 利用后缀数组求字符串的最长重复子串
- 使用后缀数组求字符串的最长重复子串
- js 后缀数组求最大重复子串
- [珠玑之椟]字符串和序列:左移、哈希、最长重复子序列的后缀数组解法、最大连续子序列
- [珠玑之椟]字符串和序列:左移、哈希、最长重复子序列的后缀数组解法、最大连续子序列
- [珠玑之椟]字符串和序列:左移、哈希、最长重复子序列的后缀数组解法、最大连续子序列
- [珠玑之椟]字符串和序列:左移、哈希、最长重复子序列的后缀数组解法、最大连续子序列
- 编程珠玑---读书笔记---使用后缀数组查找最长重复子串
- 后缀数组求最长重复子串
- 后缀数组求最长重复子串
- 后缀数组求最长重复子串
- 后缀数组求最长重复子串
- 后缀数组求最长重复子串
- 后缀数组求最长重复子串
- 后缀数组求最长重复子串
- 深度看MVC
- 【Cocos2d-X开发学习笔记】第21期:动画类(CCAnimate)的使用
- Java线程的挂起与唤醒
- 欧拉回路+图的连通性
- Implement substring in C
- 编程珠玑 用后缀数组求字符串的最大重复子串
- 从归并排序到数列的逆序数对(微软笔试题)
- 理解 Proc 文件系统
- linux下vim中文乱码的解决方法
- Uart_Printf()函数实现
- ASP.NET MVC 的URL路由介绍
- HDU 2647 Reward 反向拓补排序
- 【黑马程序员】技术加强之代理与动态加载类
- 【Centos5.x】DNS slave 区域