青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天之道

享受編程的樂趣。
posts - 118, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

最長重復子串

Posted on 2012-12-05 17:58 hoshelly 閱讀(1164) 評論(0)  編輯 收藏 引用 所屬分類: Programming
描述
對于一個字符串S1,其中S2是他的一個子串(長度嚴格小于S1長度),如果S2在S1中出現次數超過1次,那么S2就是一個重復子串,現在的要求是給定S1,請求出他的最長重復子串;

如果有多個長度一樣的最長子串,請輸入字典序最小那個串;

比如bbbaaaccc

那么最長子串就是aa

輸入
第一行包含一個整數T,表示有T組數據

對于每組數據包含一行,該行有一個字符串,長度小于10,000

輸出
對于每組數據請輸出他的最長重復子串,保證每組數據都有;

樣例輸入
2
abacabac
abacabbac

樣例輸出
abac
bac

代碼測試通過(普通版):

#include<stdio.h>
#include<string.h>
#define N 10000
int main()
{
    char a[N];
    int i,j,n,t,p,max,t1;
    scanf("%d",&t1);
    while(t1--)
    {
    max = 0;
    scanf("%s",a);
    n=strlen(a);
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            t=0;
            while(a[i+t]==a[j+t]&&(j+t)<n)
                t++;
            if(t>max)
            {
                max=t;
                p=i;
            }
            else if(t == max) //如果有長度一樣的最長重復子串,那么比較它們的字典序
            {
                if(a[i]<a[p])
                {
                    max = t;
                    p = i;
                }
            }
        }
    }
    for(i=p;i<p+max;i++)
        printf("%c",a[i]);
    printf("\n");
    }
    return 0;
}
普通算法效率較低,為O(n²)。


第二種方法是用后綴數組實現。轉自:http://hi.baidu.com/qwertlooker/item/44f3fe52ad772cdbd58bacfd

如果程序至多可以處理MAXN個字符,這些字符被存儲在數組c中:
#define MAXN 5000000
char c[MAXN], *a[MAXN];
 在讀取輸入時,首先初始化a,這樣,每個元素就都指向輸入字符串中的相應字符:
while (ch = getchar()) != EOF
a[n] = &c[n];
c[n++] = ch;
c[n] = 0 //將數組c中的最后一個元素設為空字符,以終止所有字符串
這樣,元素a[0]指向整個字符串,下一個元素指向以第二個字符開始的數組的后綴,等等。如若輸入字符串為"banana",該數組將表示這些后綴:
a[0]:banana
a[1]:anana
a[2]:nana
a[3]:ana
a[4]:na
a[5]:a
由于數組a中的指針分別指向字符串中的每個后綴,所以將數組a命名為"后綴數組"
第二,對后綴數組進行快速排序,以將后綴相近的(變位詞)子串集中在一起
qsort(a, n, sizeof(char*), pstrcmp)后
a[0]:a
a[1]:ana
a[2]:anana
a[3]:banana
a[4]:na
a[5]:nana
第三,使用以下comlen函數對數組進行掃描比較鄰接元素,以找出最長重復的字符串:
for i = [0, n)
     if comlen(a[i], a[i+1]) > maxlen
         maxlen = comlen(a[i], a[i+1])
         maxi = i
printf("%.*s\n", maxlen, a[maxi])
由于少了內層循環,只是多了一次排序,因此該算法的運行時間為O(n logn). (nlogn比n大,取nlogn)

實現代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXCHAR 10000 //最長處理10000個字符

char c[MAXCHAR], *a[MAXCHAR];

int comlen( char *p, char *q ){  //計算最長重復子串的長度
    int i = 0;
    while( *p && (*p++ == *q++) )
        ++i;
    return i;
}

int pstrcmp( const void *p1, const void *p2 ){
    return strcmp( *(charconst *)p1, *(charconst*)p2 );
}

int main( ){
    int t;
    char ch;
    int i, temp;
    scanf("%d\n",&t);
    while(t--)
    {   
        int n=0;
        int maxlen=0, maxi=0;

      while( (ch=getchar())!='\n' ){
        a[n]=&c[n];
        c[n++]=ch;
    }
    c[n]='\0';
    qsort( a, n, sizeof(char*), pstrcmp ); //快速排序對后綴數組進行排序,以使后綴相同的子串集中在一起,
                                           
//以便接下來comlen函數對這些子串進行計算其最長重復子串
    for(i=0; i<n-1; ++i ){
        temp=comlen( a[i], a[i+1] );
        if( temp>maxlen )
        {
            maxlen=temp;
            maxi=i;
        }
    }
    printf("%.*s\n",maxlen, a[maxi]); //輸出最長重復子串
    }
    return 0;
}

第三種方法似乎可以用后綴樹實現,效率可以提高到O(n),具體的后綴樹講解可以參照這篇文章:
http://blog.csdn.net/v_july_v/article/details/6897097(PS:智商有限,后面部分講解理解不了)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲在线一区| 欧美成年人视频网站| 经典三级久久| 国产有码一区二区| 伊人色综合久久天天| 影音先锋久久| 日韩一区二区久久| 亚洲无线视频| 香蕉精品999视频一区二区| 欧美一区二区视频网站| 狂野欧美性猛交xxxx巴西| 亚洲成人在线免费| 国产九色精品成人porny| 国产精品婷婷| 亚洲国产日本| 亚洲无毛电影| 麻豆久久精品| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲精品影视在线观看| 香蕉尹人综合在线观看| 欧美成人首页| 国产精品伊人日日| 亚洲精品综合精品自拍| 性欧美暴力猛交另类hd| 亚洲福利视频二区| 亚洲欧美日韩国产中文| 欧美成人精品1314www| 国产女主播视频一区二区| 亚洲精品日韩久久| 久久精品视频在线观看| 一区二区欧美激情| 欧美激情导航| 一区在线电影| 欧美中文在线观看| 一本色道久久88综合日韩精品| 久久激情综合| 国产精品一区二区三区免费观看| 亚洲激情二区| 玖玖视频精品| 久久精品99无色码中文字幕| 欧美日韩一区二区三区四区在线观看| 在线日韩日本国产亚洲| 国产欧美91| 一本色道久久综合狠狠躁篇的优点| 久久乐国产精品| 亚洲中无吗在线| 欧美性一区二区| 一本色道**综合亚洲精品蜜桃冫| 免费高清在线视频一区·| 亚洲午夜视频在线| 欧美午夜片在线观看| 中日韩美女免费视频网站在线观看| 欧美激情日韩| 男人插女人欧美| 亚洲精品在线看| 最新日韩在线| 欧美日韩国产综合视频在线观看中文| 91久久在线播放| 亚洲国产精品一区在线观看不卡| 久久久99久久精品女同性| 国产亚洲欧美另类中文| 久久精品女人| 狂野欧美激情性xxxx欧美| 伊人成人在线| 亚洲欧洲日产国产网站| 欧美日韩免费观看一区| 亚洲午夜激情网页| 亚洲一区三区电影在线观看| 国产精品亚洲美女av网站| 欧美专区一区二区三区| 久久久亚洲一区| 亚洲乱码国产乱码精品精可以看| 亚洲国产影院| 国产精品―色哟哟| 久久综合网色—综合色88| 欧美电影免费观看高清完整版| 99热在这里有精品免费| 一区二区三区av| 国产一区 二区 三区一级| 欧美99在线视频观看| 欧美激情一区三区| 欧美一级二级三级蜜桃| 久久久精品午夜少妇| 99精品视频一区| 欧美一区网站| 亚洲国产中文字幕在线观看| 99天天综合性| 国内久久婷婷综合| 亚洲精品久久久久久下一站| 国产精品一区二区三区久久| 欧美大片网址| 国产欧美一区二区视频| 亚洲黄页视频免费观看| 国产免费观看久久黄| 亚洲国产免费| 国产自产精品| 亚洲视频视频在线| 亚洲人成网在线播放| 亚洲影院色无极综合| 亚洲日本中文| 午夜日韩av| 一区二区高清视频在线观看| 欧美一区二区三区婷婷月色| 一区二区电影免费观看| 久久精品30| 午夜精品久久久久久久99热浪潮| 欧美激情一区三区| 国产精品美女在线| 亚洲国产美女| 激情综合视频| 亚洲天堂偷拍| 99在线精品免费视频九九视| 久久国产免费看| 亚洲男人第一av网站| 欧美激情视频一区二区三区免费| 久久精品免费观看| 国产精品亚洲精品| 在线综合欧美| 一本一道久久综合狠狠老精东影业 | 久久国产精品免费一区| 一本久久青青| 久热精品视频在线观看| 久久国产精品久久精品国产| 欧美视频一区二区三区四区| 亚洲国产成人tv| 在线不卡a资源高清| 欧美一区二区视频观看视频| 亚洲自拍偷拍麻豆| 欧美日韩精品在线观看| 亚洲国产影院| 亚洲精品国产系列| 欧美福利一区| 亚洲国产精品一区二区尤物区| **性色生活片久久毛片| 欧美资源在线观看| 久久精品视频亚洲| 国产欧美三级| 亚洲欧美国内爽妇网| 亚洲综合欧美| 欧美亚韩一区| 亚洲一区在线播放| 欧美夜福利tv在线| 国产亚洲欧美日韩精品| 久久国产99| 欧美国产先锋| 99热免费精品| 国产精品久久久久三级| 亚洲欧美日本国产有色| 久久成人免费| 狠狠色伊人亚洲综合网站色| 久久国产精品电影| 欧美国产精品人人做人人爱| 最新日韩在线视频| 欧美日韩一卡二卡| 亚洲欧美国产精品桃花| 久久久午夜精品| 91久久精品美女高潮| 欧美精选一区| 午夜精品区一区二区三| 玖玖玖国产精品| 99在线精品观看| 国产私拍一区| 欧美不卡在线| 国产精品99久久久久久久女警| 久久精品欧美日韩| 亚洲精品日产精品乱码不卡| 欧美小视频在线| 久久精品二区| 99re热这里只有精品免费视频| 午夜国产一区| 欧美国产第一页| 一本到高清视频免费精品| 久久久999精品免费| 亚洲九九九在线观看| 国产精品每日更新在线播放网址| 久久国产精品一区二区三区| 亚洲欧洲日产国产网站| 久久国产精品久久久| 最新日韩欧美| 国产亚洲欧美另类中文| 欧美日韩成人网| 久久久久久亚洲精品杨幂换脸| 日韩一级大片在线| 欧美大胆成人| 欧美一区二区三区在线| 一区二区三区日韩欧美| 亚洲电影毛片| 国产日韩一区二区三区在线播放 | 国产精品观看| 久久综合狠狠综合久久综青草 | 国产精品女主播在线观看| 久久综合色综合88| 午夜精品剧场| 亚洲美女中出| 国产一区二区三区久久久| 欧美日韩伦理在线免费| 理论片一区二区在线| 欧美怡红院视频一区二区三区| 亚洲免费电影在线| 亚洲黄色av|