KMP

28. Implement strStr()
459. Repeated Substring Pattern
1392. Longest Happy Prefix (KMP求next數(shù)組)
P3375 【模板】KMP字符串匹配

從頭到尾徹底理解KMP(2014年8月22日版)

給定模式串 pattern 和目標串 text挎塌,求模式串在目標串中的所有出現(xiàn)位置

  • 暴力算法 O(mn)
    the brute force method is to match all substrings in text with the pattern string
    if len(p) = m, len(text) = n, it will O(mn) time in the worst case
    what is the worst case? pattern is "aaaaa" and text is "aaaaaaaaaaaaaaaa",
    in this case until we reach the last char of pattern can we know they have a match

  • 為什么暴力算法可以加速寞冯,有哪些浪費
    相鄰的兩次匹配有許多重復(fù)比較猛们,so many repeated comparisons
    如果我們知道藍色T的后綴和紅T的前綴相同
    當(dāng)藍T的后綴匹配了S串的時候,紅T的前綴也可以匹配S串
    紅T匹配時就可以直接從黃色箭頭位置開始


    kmp1

    kmp2
  • KMP partial match table
    pm[i] 表示 字符串長度為i+1的前綴里(除本身外)楞陷,最長相等前后綴的長度


    kmp3

    next[i] means if we reach i in pattern string and find a mismatch, the position of pattern string we should move back so as to compare with the corresponding text char


    kmp4

    在2的位置發(fā)現(xiàn)mismatch, 將pattern的2位置對齊這個mismatch的位置
    因為什么呢,在mismatch之前的部分营曼,最長相等前后綴的長度為2
    that means in previous successful match, pattern's 2 位前綴和其 2 為后綴相同(綠色部分)蛾派,所以前兩個不用再比較,compare from the third number(index is 2)
    kmp5

    失配往毡,模式串跳next

  • 如何快速計算next - 動態(tài)規(guī)劃

KMP模板蒙揣,雖然沒有通過洛谷的所有testcase,但模板是對的

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class LuoP3375 {
    public static void main(String[] args) {
        char[] pattern = new char[]{'A', 'B', 'A'};
        char[] text = new char[]{'A', 'B', 'A', 'B', 'A', 'B', 'C'};
//        Scanner in = new Scanner(System.in);
//        String s1 = in.nextLine();
//        String s2 = in.nextLine();
//        in.close();
//        char[] text = s1.toCharArray();
//        char[] pattern = s2.toCharArray();
        int[] next = getNext(pattern);
        List<Integer> res = kmp(pattern, text, next);
        for (int i = 0; i < res.size(); i++) {
            System.out.println(res.get(i) + 1);
        }
        for (int i = 1; i < next.length; i++) {
            System.out.print(next[i] + " ");
        }
    }
    public static List<Integer> kmp(char[] pattern, char[] text, int[] next) {
        int i = 0, j = 0;
        int len1 = text.length, len2 = pattern.length;
        List<Integer> res = new ArrayList<>();
        while (i < len1 && j < len2) {
            if (j == -1 || text[i] == pattern[j]) {
                i++; j++;
            } else {
                j = next[j];
            }
            if (j == len2) {
                res.add(i - len2);
                j = next[j];
            }
        }
        return res;
    }
    public static int[] getNext(char[] pattern) {
        int[] next = new int[pattern.length + 1];
        next[0] = -1;
        int j = -1, i = 0;
        while (i < pattern.length) {
            if (j == -1 || pattern[i] == pattern[j]) {
                next[++i] = ++j;
            } else {
                j = next[j];
            }
        }
        return next;
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末开瞭,一起剝皮案震驚了整個濱河市懒震,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗤详,老刑警劉巖个扰,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異葱色,居然都是意外死亡递宅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來办龄,“玉大人烘绽,你說我怎么就攤上這事±睿” “怎么了安接?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長英融。 經(jīng)常有香客問我盏檐,道長,這世上最難降的妖魔是什么驶悟? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任胡野,我火速辦了婚禮,結(jié)果婚禮上撩银,老公的妹妹穿的比我還像新娘给涕。我一直安慰自己,他們只是感情好额获,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布够庙。 她就那樣靜靜地躺著,像睡著了一般抄邀。 火紅的嫁衣襯著肌膚如雪耘眨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天境肾,我揣著相機與錄音剔难,去河邊找鬼。 笑死奥喻,一個胖子當(dāng)著我的面吹牛偶宫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播环鲤,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼纯趋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冷离?” 一聲冷哼從身側(cè)響起吵冒,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎西剥,沒想到半個月后痹栖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡瞭空,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年揪阿,在試婚紗的時候發(fā)現(xiàn)自己被綠了疗我。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡南捂,死狀恐怖碍粥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黑毅,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布钦讳,位于F島的核電站矿瘦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏愿卒。R本人自食惡果不足惜缚去,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琼开。 院中可真熱鬧易结,春花似錦、人聲如沸柜候。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渣刷。三九已至鹦肿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辅柴,已是汗流浹背箩溃。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碌嘀,地道東北人涣旨。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像股冗,于是被迫代替她去往敵國和親霹陡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

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

  • 看這個視頻就好啦 https://www.youtube.com/watch?v=dgPabAsTFa8&t=3s...
    98Future閱讀 601評論 0 0
  • 簡單理解KMP 本文讀者可以獲得兩方面的知識 直觀理解如何生成部分匹配表(下文簡稱匹配表)魁瞪,這是KMP算法的核心思...
    周一不上班閱讀 619評論 0 0
  • 給定一個長度為n的主字符串str和一個長度為m的pattern(如str = 'qwertyuiopasdfghj...
    9_SooHyun閱讀 536評論 0 0
  • “喲导俘,這是干嘛去啊峦耘。” 樸珍榮嘴角輕輕提了提旅薄,眼角卻平平的辅髓,用全臉的肌肉完美的演示了一個好看的假笑泣崩。 “班長啊,這...
    July29閱讀 299評論 0 0
  • 分別的那天 你說要帶我去看海 那是一個蕭瑟的冬天 海浪拍打著礁石發(fā)出嗚咽 我的心里如打翻的五味瓶 強忍著才不讓眼淚...
    Sophia安然閱讀 960評論 20 45