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

天之道

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

最長重復子串

Posted on 2012-12-05 17:58 hoshelly 閱讀(1158) 評論(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>
            亚洲人www| 久久亚洲春色中文字幕| 欧美激情精品久久久久久蜜臀| 国产欧美日韩在线视频| 久久成人这里只有精品| 欧美一区国产二区| 激情国产一区二区| 欧美国产日韩xxxxx| 欧美区在线观看| 午夜精品999| 久久精品中文字幕一区| 日韩系列欧美系列| 一区二区欧美日韩| 国产一区香蕉久久| 亚洲第一成人在线| 欧美日本免费一区二区三区| 亚洲欧美另类国产| 久久深夜福利免费观看| 一区二区三区偷拍| 久久国产主播| 一区二区三区日韩在线观看| 羞羞答答国产精品www一本| 在线观看国产成人av片| 一区二区欧美国产| 91久久综合亚洲鲁鲁五月天| 在线一区免费观看| 亚洲国产高清视频| 亚洲影视综合| 性欧美办公室18xxxxhd| 日韩视频亚洲视频| 国产精品99久久久久久人| 国产在线视频欧美一区二区三区| 亚洲电影免费在线| 国产精品国产三级国产a| 老色批av在线精品| 国产精品美女久久福利网站| 欧美激情欧美狂野欧美精品 | 欧美制服丝袜| 欧美高清视频免费观看| 久久精品免费播放| 欧美日韩不卡合集视频| 久久综合影视| 国产欧美欧美| 在线亚洲伦理| 在线综合视频| 欧美高清视频免费观看| 麻豆乱码国产一区二区三区| 99热免费精品| 欧美中文字幕在线视频| 欧美国产日韩xxxxx| 久久久久网站| 国产精品免费一区二区三区观看| 亚洲日本aⅴ片在线观看香蕉| 国产原创一区二区| 亚洲网站在线| 亚洲一线二线三线久久久| 欧美福利一区二区| 六月婷婷一区| 一区在线视频观看| 欧美一级黄色网| 欧美在线首页| 国产亚洲一级| 欧美尤物巨大精品爽| 欧美一区二区三区免费视频| 国产精品美女久久久| 亚洲天堂av综合网| 亚洲免费网址| 欧美激情中文不卡| 欧美视频不卡| 亚洲视频每日更新| 亚洲欧美日韩精品| 国产欧美精品一区aⅴ影院| 亚洲一区国产精品| 欧美专区18| 一区久久精品| 男女激情视频一区| 亚洲精品少妇网址| 亚洲欧美在线观看| 国产视频一区在线观看| 性欧美大战久久久久久久免费观看| 久久视频在线看| 最近中文字幕日韩精品| 欧美三级电影一区| 亚洲欧美日韩一区二区在线 | 在线一区二区日韩| 国产精品久久久久久久久搜平片| 亚洲综合色在线| 免费av成人在线| 一本色道久久88亚洲综合88| 国产精品久久国产愉拍| 久久gogo国模裸体人体| 亚洲高清自拍| 香蕉精品999视频一区二区| 狠狠色丁香久久综合频道 | 欧美在线3区| 91久久精品美女| 午夜视频一区在线观看| 影音先锋中文字幕一区| 欧美日韩中文字幕在线视频| 欧美影片第一页| 99精品国产在热久久| 久久久夜精品| 亚洲午夜精品在线| 一区二区三区在线看| 欧美日韩精品免费观看| 久久精品在线| 亚洲一区激情| 亚洲区一区二| 免费久久精品视频| 亚洲欧美日韩一区在线| 亚洲国内欧美| 国产一区二区三区最好精华液| 欧美美女bbbb| 美女国产精品| 欧美在线播放一区| 亚洲网址在线| 中国日韩欧美久久久久久久久| 国产在线一区二区三区四区| 欧美日韩综合网| 欧美国产日韩一区二区在线观看| 欧美一区二区三区在线视频| 日韩一区二区久久| 欧美激情国产高清| 欧美精品久久一区二区| 亚洲欧美日韩综合一区| 亚洲激情视频在线| 欧美福利电影在线观看| 久久国产精品色婷婷| 亚洲综合色视频| 亚洲视频在线视频| 亚洲精品国产精品乱码不99按摩| 黄色成人av| 黑人一区二区| 国内成人自拍视频| 国产亚洲精品久久久久动| 国产精品日本欧美一区二区三区| 欧美日韩一区国产| 欧美日韩精品二区| 欧美久久久久| 欧美日韩国产色站一区二区三区| 女同性一区二区三区人了人一| 久久嫩草精品久久久精品一| 久久精品官网| 久久永久免费| 免费在线看一区| 欧美激情精品久久久久久变态| 欧美日本在线观看| 欧美日韩综合精品| 国产农村妇女毛片精品久久麻豆 | 午夜精品久久久久久久久久久久 | 日韩视频在线免费| 一本久久a久久精品亚洲| 亚洲毛片一区| 午夜欧美电影在线观看| 久久精品国产99国产精品| 久久精品在这里| 欧美日韩福利| 欧美日韩在线视频一区| 欧美日韩国产丝袜另类| 欧美日韩无遮挡| 国产精品一区=区| 一区在线播放视频| 亚洲日韩欧美视频一区| 一本色道久久综合亚洲二区三区| 在线性视频日韩欧美| 欧美亚洲一区在线| 久久深夜福利| 亚洲破处大片| 亚洲欧美日韩国产一区二区三区 | 亚洲视频图片小说| 欧美一区二区三区在线| 久久伊人免费视频| 欧美日韩精品一区二区在线播放| 国产精品99免费看| 黄色在线一区| 亚洲欧美精品在线观看| 女生裸体视频一区二区三区| 日韩一级黄色大片| 久久aⅴ国产欧美74aaa| 日韩亚洲欧美在线观看| 亚洲国产精品一区| 亚洲一区二区影院| 男同欧美伦乱| 亚洲一级二级| 欧美1级日本1级| 国产偷国产偷精品高清尤物| 亚洲国产小视频在线观看| 亚洲女性裸体视频| 亚洲精品久久久久久久久| 亚洲欧美在线磁力| 亚洲国产另类久久精品| 香蕉久久夜色精品国产| 欧美精品九九| 亚洲国产精品传媒在线观看| 一本一本久久a久久精品综合麻豆| 欧美诱惑福利视频| 亚洲精品系列| 久热精品视频在线观看| 国产一级精品aaaaa看| 亚洲综合三区|