编程珠玑 用后缀数组求字符串的最大重复子串

来源:互联网 发布:淘宝主营在哪里看 编辑:程序博客网 时间: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;}


原创粉丝点击