• <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>
            面對現實,超越自己
            逆水行舟,不進則退
            posts - 269,comments - 32,trackbacks - 0
            轉自:http://apps.hi.baidu.com/share/detail/6937479

            對于類似從給定的文本中,查找其中最長的重復子字符串的問題,可以采用“后綴數組”來高效地完成此任務。后綴數組使用文本本身和n個附加指針(與文本數組相應的指針數組)來表示輸入文本中的n個字符的每個子字符串。
                首先,如果輸入字符串存儲在c[0..n-1]中,那么就可以使用類似于下面的代碼比較每對子字符串:
                maxlen = -1
                for i = [0, n)
                    for j = (i, n)
                        if (thislen = comlen(&c[i], &c[j])) > maxlen
                            maxlen = thislen
                            maxi = i
                            maxj = j
                當作為comlen函數參數的兩個字符串長度相等時,該函數便返回這個長度值,從第一個字符開始:
                int comlen(char *p, char* q)
                    i = 0
                    while *p && (*p++ = *q++)
                        i++
                    return i
                由于該算法查看所有的字符串對,所以它的時間和n的平方成正比。下面便是使用“后綴數組”的解決辦法。
                如果程序至多可以處理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). 

            完整代碼如下:
             1 #include <stdio.h>
             2 #include <stdlib.h>
             3 #include <string.h>
             4 
             5 #define MAXCHAR 5000 //最長處理5000個字符
             6 
             7 char c[MAXCHAR], *a[MAXCHAR];
             8 
             9 int comlen( char *p, char *q )
            10 {
            11     int i = 0;
            12     while*&& (*p++ == *q++) )
            13         ++i;
            14     return i;
            15 }
            16 
            17 int pstrcmp( const void *p1, const void *p2 )
            18 {
            19     return strcmp( *(char* const *)p1, *(char* const*)p2 );
            20 }
            21 
            22 int main( )
            23 {
            24     char ch;
            25     int n=0;
            26     int i, temp;
            27     int maxlen=0, maxi=0;
            28     printf("Please input your string:\n");
            29     while( (ch=getchar())!='\n' )
            30    {
            31         a[n]=&c[n];
            32         c[n++]=ch;
            33     }
            34     c[n]='\0';
            35     qsort( a, n, sizeof(char*), pstrcmp );
            36     for(i=0; i<n-1++i )
            37    {
            38         temp=comlen( a[i], a[i+1] );
            39         if( temp>maxlen )
            40         {
            41             maxlen=temp;
            42             maxi=i;
            43         }
            44     }
            45     printf("%.*s\n",maxlen, a[maxi]);
            46     system("PAUSE");
            47     return 0;
            48 }

            posted on 2012-03-30 13:03 王海光 閱讀(724) 評論(0)  編輯 收藏 引用 所屬分類: 算法
            久久国产一片免费观看| 久久精品亚洲日本波多野结衣 | 狼狼综合久久久久综合网| 九九精品99久久久香蕉| segui久久国产精品| 欧美亚洲国产精品久久久久| 久久r热这里有精品视频| 欧美精品国产综合久久| 国产国产成人久久精品| 一本色道久久综合狠狠躁篇| 亚洲午夜久久影院| 久久www免费人成看片| 久久综合五月丁香久久激情| 2020最新久久久视精品爱| 久久一本综合| 浪潮AV色综合久久天堂| 久久精品中文字幕有码| 国产婷婷成人久久Av免费高清| 国产呻吟久久久久久久92| 少妇久久久久久久久久| 久久久久免费精品国产| 国产精品gz久久久| 久久精品日日躁夜夜躁欧美| 丁香五月综合久久激情| 无码久久精品国产亚洲Av影片| 看全色黄大色大片免费久久久| 精品久久人妻av中文字幕| 色婷婷久久久SWAG精品| 一级做a爰片久久毛片免费陪| 久久久无码人妻精品无码| 一本久久a久久精品综合香蕉| 99久久国产综合精品五月天喷水| 久久午夜无码鲁丝片| 久久亚洲AV永久无码精品| 99精品久久精品| 国产91色综合久久免费| 伊人久久大香线蕉综合影院首页| 久久99精品久久久久久hb无码| 免费精品久久天干天干| 久久久久亚洲AV无码观看| 久久精品国产亚洲AV忘忧草18|