• <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 - 183,  comments - 10,  trackbacks - 0

            找出字符串中最大的子串

            子串:當(dāng)重復(fù)出現(xiàn)某個(gè)字符時(shí),這個(gè)字符串就是子串
            例如:
            字符串 abcd13agbf
            子串為:abcd13a, bcd13agb

            求解 1
            兩重遍歷字符串,檢測(cè)左右兩個(gè)端點(diǎn)的字符是否一樣,如果相等,則是子串
            這種方法直觀,時(shí)間復(fù)雜度為 O(N ^ 2)。

            求解 2
            盡可能從問(wèn)題中挖掘潛在的信息,獲得的信息越多越有利于解決問(wèn)題,也就越有可能獲得高效的解法。
            針對(duì)字符,我們知道其 ASCII 范圍是 0 - 255 ,我們這設(shè)計(jì)一個(gè)二維數(shù)組
            int x[256][100];
            x 存儲(chǔ)每個(gè)字符所在的位置
            用 int n[256]; 記錄每個(gè)字符出現(xiàn)的次數(shù)
            掃描一遍字符串,即可得到我們想要的信息并存儲(chǔ)于 x 和 n 中
            然后對(duì) x 進(jìn)行掃描,即可得到最大的子串
            第一次掃描字符串時(shí)間復(fù)雜度是 O(N)
            第二次掃描 x ,時(shí)間復(fù)雜度也是 O(N)
            總的時(shí)間復(fù)雜度為 O(N)

            實(shí)現(xiàn):

             1 #include <iostream>
             2 using namespace std;
             3 
             4 char* maxSubStr(char* s, const char* str)
             5 {
             6     int left = 0, right = 0;
             7     int max = 0;
             8     for (int i = 0; i < strlen(str); ++i)
             9     {
            10         int temp = 1;
            11         for (int j = i + 1; j < strlen(str); ++j)
            12         {
            13             if (str[i] == str[j])
            14             {
            15                 ++temp;
            16                 if (temp > max)
            17                 {
            18                     max = temp;
            19                     left = i;
            20                     right = j;
            21                 }
            22             }
            23             else
            24             {
            25                 ++temp;
            26             }
            27         }
            28     }
            29     int j = 0;
            30     for (int i = left; i <= right; ++i, ++j)
            31     {
            32         s[j] = str[i];
            33     }
            34     s[j] = '\0';
            35     return s;
            36 }
            37 
            38 char* maxSubStrX(char* s, const char* str)
            39 {
            40     static int x[256][100];
            41     static int n[256];
            42     memset(x, -1sizeof (x));
            43     memset(n, 0sizeof (n));
            44     for (int i = 0; i < strlen(str); ++i)
            45     {
            46         x[ str[i] ][ n[ str[i] ] ] = i;
            47         ++n[str[i]];
            48     }
            49     int left = 0, right = 0;
            50     int max = 0;
            51     for (int i = 0; i < 256++i)
            52     {
            53         for (int j = 0; j < n[i] - 1++i)
            54         {
            55             if (x[i][j + 1- x[i][j] > max)
            56             {
            57                 max = x[i][j + 1- x[i][j];
            58                 left = x[i][j];
            59                 right = x[i][j + 1];
            60             }
            61         }
            62     }
            63     int j = 0;
            64     for (int i = left; i <= right; ++i, ++j)
            65     {
            66         s[j] = str[i];
            67     }
            68     s[j] = '\0';
            69     return s;
            70 }
            71 
            72 int main()
            73 {
            74     char str[100], s[100];
            75     while (cin >> str)
            76     {
            77         cout << maxSubStr(s, str) << endl;
            78         cout << maxSubStrX(s, str) << endl;
            79     }
            80     return 0;
            81 }

             


            posted on 2011-06-27 18:29 unixfy 閱讀(629) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            72种姿势欧美久久久久大黄蕉| 热久久最新网站获取| 久久久久久九九99精品| 久久婷婷五月综合国产尤物app| 97久久精品国产精品青草| 精品免费tv久久久久久久| 国产高清美女一级a毛片久久w| 四虎国产精品免费久久5151| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 东方aⅴ免费观看久久av| 亚洲综合精品香蕉久久网| 久久精品国产亚洲沈樵| 亚洲人成无码网站久久99热国产| 亚洲精品乱码久久久久久久久久久久 | 国产巨作麻豆欧美亚洲综合久久| 亚洲人成无码www久久久| 久久91精品国产91久久户| 欧美一级久久久久久久大| 久久99精品国产自在现线小黄鸭 | 久久精品国产亚洲av麻豆图片| 97久久综合精品久久久综合| 精品无码久久久久国产动漫3d| 亚洲天堂久久精品| 久久久久人妻一区二区三区vr| 女同久久| 久久久人妻精品无码一区| 色综合合久久天天综合绕视看| 亚洲国产另类久久久精品黑人| 三级韩国一区久久二区综合| 91久久精品国产成人久久| 精品无码久久久久久午夜| 亚洲午夜久久久久久噜噜噜| 性高朝久久久久久久久久| 国产一区二区精品久久岳| 久久综合欧美成人| 精品久久久久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久久久久精品无码人妻| 亚洲人成无码www久久久| 日韩久久久久中文字幕人妻| 久久午夜无码鲁丝片午夜精品|