最长重复子字符串

 

int comlen(const char* str1,const char* str2){
    assert((str1!=0)&&(str2!=0));
    int len=0;
    while(*str1!='\0'&&*str2!='\0'&&*str1++==*str2++){
        len++;
    }
    return len;
}

bool less(char* str1,char* str2){
    return strcmp(str1,str2)<=0;
}

/*后缀数组法*/
void longestRepeatedSubstring2(char* string){
    int n=strlen(string);
    char** a=new char*[n];
    for(int i=0;i<n;i++){
        a[i]=string+i;
    }
    sort(a,a+n,::less);

    int maxlen=-1,maxi;
    for(int i=0;i<n-1;i++){
        int len=comlen(a[i],a[i+1]);
        if(len>maxlen){
            maxlen=len;
            maxi=i;
        }
    }

    printf("%.*s\n",maxlen,a[maxi]);//使用"*"精度输出字符串中的maxlen个字符

    delete []a;
}

/*穷举法*/
void longestRepeatedSubstring1(char* str){
    int n=strlen(str);
    int maxlen=-1,maxi,maxj;
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            int len=comlen(str+i,str+j);
            if(len>maxlen){
                maxlen=len;
                maxi=i;
                maxj=j;
            }
        }
    }
    
    cout<<"longest repeated substring is: ";
    printf("%.*s\n",maxlen,str+maxi);
    printf("appear at %d and %d\n",maxi,maxj);
}
posted @ 2012-08-13 20:39  freewater  阅读(265)  评论(0)    收藏  举报