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

            對于類似從給定的文本中,查找其中最長的重復(fù)子字符串的問題,可以采用“后綴數(shù)組”來高效地完成此任務(wù)。后綴數(shù)組使用文本本身和n個(gè)附加指針(與文本數(shù)組相應(yīng)的指針數(shù)組)來表示輸入文本中的n個(gè)字符的每個(gè)子字符串。
                首先,如果輸入字符串存儲在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
                當(dāng)作為comlen函數(shù)參數(shù)的兩個(gè)字符串長度相等時(shí),該函數(shù)便返回這個(gè)長度值,從第一個(gè)字符開始:
                int comlen(char *p, char* q)
                    i = 0
                    while *p && (*p++ = *q++)
                        i++
                    return i
                由于該算法查看所有的字符串對,所以它的時(shí)間和n的平方成正比。下面便是使用“后綴數(shù)組”的解決辦法。
                如果程序至多可以處理MAXN個(gè)字符,這些字符被存儲在數(shù)組c中:
                #define MAXN 5000000
                char c[MAXN], *a[MAXN];
                在讀取輸入時(shí),首先初始化a,這樣,每個(gè)元素就都指向輸入字符串中的相應(yīng)字符:
                while (ch = getchar()) != EOF
              a[n] = &c[n];
              c[n++] = ch;
             c[n] = 0 //將數(shù)組c中的最后一個(gè)元素設(shè)為空字符,以終止所有字符串。
             這樣,元素a[0]指向整個(gè)字符串,下一個(gè)元素指向以第二個(gè)字符開始的數(shù)組的后綴,等等。如若輸入字符串為"banana",該數(shù)組將表示這些后綴:
             a[0]:banana
             a[1]:anana
             a[2]:nana
             a[3]:ana
             a[4]:na
             a[5]:a
             由于數(shù)組a中的指針分別指向字符串中的每個(gè)后綴,所以將數(shù)組a命名為"后綴數(shù)組"
             第二,對后綴數(shù)組進(jìn)行快速排序,以將后綴相近的(變位詞)子串集中在一起
             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函數(shù)對數(shù)組進(jìn)行掃描比較鄰接元素,以找出最長重復(fù)的字符串:
             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])
             由于少了內(nèi)層循環(huán),只是多了一次排序,因此該算法的運(yùn)行時(shí)間為O(n logn). 

            完整代碼如下:
             1 #include <stdio.h>
             2 #include <stdlib.h>
             3 #include <string.h>
             4 
             5 #define MAXCHAR 5000 //最長處理5000個(gè)字符
             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 王海光 閱讀(739) 評論(0)  編輯 收藏 引用 所屬分類: 算法
            亚洲精品白浆高清久久久久久 | 久久亚洲精品中文字幕三区| 久久这里只有精品18| 久久线看观看精品香蕉国产| 久久久久国产一区二区三区| 亚洲人成伊人成综合网久久久| 中文字幕热久久久久久久| 国产精品热久久毛片| 久久人人爽人人爽人人片AV不 | 久久综合久久自在自线精品自| 国产精品无码久久综合| 久久精品国产99久久丝袜| 精品久久人妻av中文字幕| 久久精品国产清自在天天线| 久久A级毛片免费观看| 久久久亚洲裙底偷窥综合| 久久A级毛片免费观看| 免费无码国产欧美久久18| 国产精品青草久久久久福利99| 久久久久亚洲精品无码蜜桃| 欧美成人免费观看久久| 久久夜色撩人精品国产| 亚洲嫩草影院久久精品| 久久久婷婷五月亚洲97号色| 青青草国产97免久久费观看| 国产精品美女久久久久AV福利| 亚洲国产精品一区二区久久| 大伊人青草狠狠久久| 无码人妻精品一区二区三区久久久 | 狠狠色婷婷久久综合频道日韩| 久久99精品久久久久久噜噜| 91精品国产91久久久久久青草| 久久精品www人人爽人人| 色综合久久久久久久久五月| 亚洲∧v久久久无码精品| 久久综合色老色| av色综合久久天堂av色综合在| 免费一级欧美大片久久网 | 亚洲国产精品成人久久| 国产aⅴ激情无码久久| 精品综合久久久久久98|