KMP 單模式匹配, 實現 strStr

2021-06-19 15:49:50 字數 776 閱讀 8831

knuth-morris-pratt演算法

kmp: 單模式匹配, 判斷s1是否是s2的子串

原理:通過乙個輔助函式next(),實現跳過不必要的目標字串,已達到優化效果

時間複雜度: o(m+n)

主要思想:

在失配之後,並不簡單的從目標串的下乙個字元開始新一輪的檢測, 而是依據在檢測之前得到的有用資訊,直接跳過必要的檢測

* 有用資訊: 字首函式next

let p = 已經匹配的字串 exp. ababa, p = 5

l = len(特殊字串), 指即使自身真字尾(不等於自己), 又是自身最長字首的字串, for ababa, 特殊字串 = aba, l = 3

則有效位移 s = p - l = 5-3 = 2,

**:kmp的核心: 獲得記錄跳轉狀態的next陣列

// exp: "cdf": [-1, -1, -1]

// exp: "ababa": [-1, -1, 0, 1, 2]

public int next(string sub)

return a;

}

匹配方法: 

public int pattern(string str, string sub)

i++;

j++;

}else if(j = 0)else

}return -1;

}

KMP(單模式匹配)

單字串匹配,返回匹配位址 求出匹配總次數 求迴圈元,t len next len next陣列的有效範圍是 0,len len的時候,next為有效值 只需要記住next 0 1,next 1 0,這兩個條件就可以寫出求next的函式 匹配過程只需要o n 所以i的值不需要回歸。這裡曾經糾結很久,m...

KMP 單模式串快速匹配

開始從重新學字串了,改過自新吧 洛谷p3375 模板 kmp字串匹配 定義模式串為b bb,文字串為a aa 很長 假如我們處理出了乙個b bb的kmp kmpkm p陣列其中k mp i kmp i kmp i 表示 1,i 1,i 1,i 中的最長公共前字尾,有什麼辦法加速匹配嗎?比如匹配 a ...

簡單模式匹配演算法和KMP演算法

參見原文 簡單模式匹配演算法 經典的模式匹配,是讓模式串的首字元從主串的首字元開始向右匹配。匹配的規則是 1.在主串的第i個位置,讓pos i,如果主串pos位置的字元等於模式串的第乙個字元,則pos 再與模式串的第二個字元進行匹配。2.如果又相等則繼續向下匹配,直到匹配到模式串的結尾,就說明主串中...