KMP算法

相當(dāng)于str1.indexOf(str2)

先求str2每個字符前最長相等的前綴后綴的長度

如敢艰,‘a(chǎn)bcabcd’诬乞,在d字符位置前,前綴與后綴相等的最長長度是3钠导,即abc=abc(前綴后綴不能取整個字符串)震嫉。如,‘a(chǎn)aaaab’牡属,在b字符前票堵,最長長度是4。
求每個字符對應(yīng)的長度逮栅,為next數(shù)組悴势。
如:ababac

a b a b a c
-1 0 0 1 2 3

如何用?

當(dāng)str2的當(dāng)前字符與str1當(dāng)前字符不匹配時措伐,因為存在前綴后綴相等特纤,可以直接把前綴位置推到str1對應(yīng)的后綴位置,此時前綴和后綴匹配侥加,再往下匹配就行捧存。即str1(i)!=str2(j)時,j=next[j],繼續(xù)if(str1(i)==str2(j)).

public static int getIndexOf(String s, String m){
        if(s == null || m == null || m.length() == 0 || s.length() < m.length()){
            return -1;
        }
        char[] str1 = s.toCharArray();
        char[] str2 = m.toCharArray();
        int i = 0;
        int j = 0;
        int[] next = getNextArray(str2);
        while(i < str1.length && j < str2.length){
            if(str1[i] == str2[j]){
                i++;
                j++;
            } else if(next[j] == -1) {
                i++;
            } else {
                j = next[j];
            }
        }
        
        return j==str2.length ? i-j : -1;
    }

那么如何快速求這個next數(shù)組?

數(shù)學(xué)歸納法
next[0] = -1
next[1] = 0
假設(shè)next[i-1] = k
若str2[k]==str2[i-1]
則next[i] = k+1
若不同昔穴,假設(shè)next[k] = m
比較str2[m]與str2[i-1],相等的話就是str2[i] = m+1,以此類推镰官。

public static int[] getNextArray(char[] str2){
        if(str2.length == 1){
            return new int[] {-1};
        }
        int[] next = new int[str2.length];
        next[0] = -1;
        next[1] = 0;
        int i = 2;
        int k = 0; // next[1]
        while(i < str2.length){
            if(str2[i - 1] == str2[k]){
                next[i++] = k + 1;
                k++; // next[i]
            } else if(k > 0){
                k = next[k];
            } else{
                next[i++] = 0;
            }
        }
        return next;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市傻咖,隨后出現(xiàn)的幾起案子朋魔,更是在濱河造成了極大的恐慌,老刑警劉巖卿操,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件警检,死亡現(xiàn)場離奇詭異,居然都是意外死亡害淤,警方通過查閱死者的電腦和手機扇雕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窥摄,“玉大人镶奉,你說我怎么就攤上這事≌阜牛” “怎么了哨苛?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長币砂。 經(jīng)常有香客問我建峭,道長,這世上最難降的妖魔是什么决摧? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任亿蒸,我火速辦了婚禮,結(jié)果婚禮上掌桩,老公的妹妹穿的比我還像新娘边锁。我一直安慰自己,他們只是感情好波岛,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布茅坛。 她就那樣靜靜地躺著,像睡著了一般盆色。 火紅的嫁衣襯著肌膚如雪灰蛙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天隔躲,我揣著相機與錄音,去河邊找鬼物延。 笑死宣旱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叛薯。 我是一名探鬼主播浑吟,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼笙纤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了组力?” 一聲冷哼從身側(cè)響起省容,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎燎字,沒想到半個月后腥椒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡候衍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年笼蛛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛉鹿。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡滨砍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妖异,到底是詐尸還是另有隱情惋戏,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布他膳,位于F島的核電站响逢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏矩乐。R本人自食惡果不足惜龄句,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望散罕。 院中可真熱鬧分歇,春花似錦、人聲如沸欧漱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽误甚。三九已至缚甩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窑邦,已是汗流浹背擅威。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冈钦,地道東北人郊丛。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厉熟。 傳聞我的和親對象是個殘疾皇子导盅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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

  • KMP是解決兩個字符串匹配問題的非常好的算法,算法的時間復(fù)雜是O(n)揍瑟。 現(xiàn)在假設(shè)場景是兩個字符串str1白翻,str...
    道禪_26ea閱讀 2,433評論 0 0
  • 1.KMP算法是什么? 1.1 KMP算法求解什么類型問題 字符串匹配绢片。給你兩個字符串滤馍,尋找其中一個字符串是否包含...
    mirqzb閱讀 1,536評論 0 1
  • 數(shù)據(jù)結(jié)構(gòu)與算法--KMP算法查找子字符串 部分內(nèi)容和圖片來自這三篇文章: 這篇文章、這篇文章杉畜、還有這篇他們寫得非常...
    sunhaiyu閱讀 1,737評論 1 21
  • KMP算法 str1 str2 求str2在str1中的開始位置幾個概念:1.最長前綴和最長后綴的匹配長度2.依據(jù)...
    shoulda閱讀 123評論 0 0
  • 前言 動態(tài)規(guī)劃(dynamic programming)是運籌學(xué)的一個分支纪蜒,是求解決策過程(decision pr...
    tianyl閱讀 2,689評論 0 1