最長前后綴

題目

實現(xiàn)函數(shù):輸入一個長度為n的字符串踩晶,輸出長度為n的數(shù)組,其中第i位表示從0到i的子串的最長前后綴長度枕磁。例如abaab的最長前后綴長度為2.

解決

  1. 暴力法
    對于長度為m的子串渡蜻,看長度為m-1的前綴、后綴是否相同计济,相同則返回茸苇,否則再看m-2,依次類推
    時間復(fù)雜度為O(n)沦寂。代碼略
  2. 更高效的方法
    觀察到這樣一個事實:
    當(dāng)output[i]=len時学密,計算output[i+1]:
    若input[i+1]==input[len],即考察的前后綴長度加1后仍然相等传藏,則output[i+1]=len+1
    否則腻暮,若len>0,則令len=output[len-1]漩氨,再繼續(xù)考察input[i+1]與input[len]西壮;若len=0,則output[i+1]=0叫惊。原因如下圖所示:


代碼

public static int[] getLPS(String str) {
        int[] result = new int[str.length()];
        int i=1;
        int len = 0;
        while(i<str.length()){
            if (str.charAt(i) == str.charAt(len)){
                len ++;
                result[i] = len;
                i ++;
            }
            else if(len>0){
                len = result[len-1];    //嘗試第二長的前后綴款青,看是否能繼續(xù)
            }
            else
                i ++; //沒有更小的候選答案了,則為0
        }
        return result;
    }

應(yīng)用:字符串匹配(KMP)

題目

實現(xiàn)KMP匹配算法霍狰,空串可以匹配任意字符串抡草,失配則返回-1

代碼

public static int strStr(String str, String pattern){
        int m = str.length();
        int n = pattern.length();
        if (n==0)
            return 0;
        int[] lps = getLPS(str);
        int i = 0;
        int j = 0;
        while(i<m){
            if (str.charAt(i) == pattern.charAt(j)){
                i ++;
                j ++;
                if (j==n)
                    return i-n;
            }
            else if (i>0)
                j = lps[j-1];
            else
                i ++;
        }
        return -1;
    }

解釋

另一種方法是求next數(shù)組,具體方法為next[0]=0或-1蔗坯,next的其余元素為最長前后綴長度加1.例如模式串“aaba”的next數(shù)組為{0康震,2,1宾濒,2}
兩種方法的區(qū)別在于:
首先next(或lps)數(shù)組的計算方式不同
使用next數(shù)組進行匹配時腿短,若在第j位失配,則令j=next[j]
而上述方法則是令j=lps[j-1]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绘梦,一起剝皮案震驚了整個濱河市橘忱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卸奉,老刑警劉巖钝诚,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異榄棵,居然都是意外死亡凝颇,警方通過查閱死者的電腦和手機潘拱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拧略,“玉大人芦岂,你說我怎么就攤上這事〖穑” “怎么了盔腔?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長月褥。 經(jīng)常有香客問我弛随,道長,這世上最難降的妖魔是什么宁赤? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任舀透,我火速辦了婚禮,結(jié)果婚禮上决左,老公的妹妹穿的比我還像新娘愕够。我一直安慰自己,他們只是感情好佛猛,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布惑芭。 她就那樣靜靜地躺著,像睡著了一般继找。 火紅的嫁衣襯著肌膚如雪遂跟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天婴渡,我揣著相機與錄音幻锁,去河邊找鬼。 笑死边臼,一個胖子當(dāng)著我的面吹牛哄尔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柠并,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼岭接,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了臼予?” 一聲冷哼從身側(cè)響起亿傅,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘟栖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谅阿,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡半哟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年酬滤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寓涨。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡盯串,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戒良,到底是詐尸還是另有隱情体捏,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布糯崎,位于F島的核電站几缭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沃呢。R本人自食惡果不足惜年栓,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望薄霜。 院中可真熱鬧某抓,春花似錦、人聲如沸惰瓜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崎坊。三九已至备禀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間流强,已是汗流浹背痹届。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留打月,地道東北人队腐。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像奏篙,于是被迫代替她去往敵國和親柴淘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,342評論 0 2
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,030評論 0 2
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,381評論 0 5
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,453評論 0 13
  • 計算機二級C語言上機題庫(南開版) 1.m個人的成績存放在score數(shù)組中秘通,請編寫函數(shù)fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,366評論 1 42