KMP演算法之我見

2021-07-30 23:19:04 字數 1291 閱讀 1776

kmp演算法(時間複雜度o(m + n))最核心的是求next陣列,然後再根據next陣列來進行模式匹配。因此分為兩部分:next陣列記錄的是模式串的特徵,即最長相同前字尾

考慮如下模式串p:abcdabc

它的字首有:a,ab,abc,abcd,abcda,abcdab

它的字尾有:c,bc,abc,dabc,cdabc,bcdabc

因此它的最長相同前字尾是abc,長度是3.

next陣列中p[i]中存的就是模式串p[0]…p[i]的最長相同前字尾長度

因此它的next陣列就是如下形式:

next陣列:

模式串pab

cdab

cnext陣列00

0012

3 有了next陣列後,我們就可以進行匹配了,考慮如下匹配串:

abcabcdabddabcdabc

abcdabc

↑當匹配到d時,發現不匹配了,普通的做法會把模式串p後移一位繼續匹配,像這樣:

abcabcdabddabcdabc

abcdabc

↑但我們發現,根據next陣列,k-1位即第乙個c對應的值為0,即前面的abc在模式串後移的過程中不能再出現匹配的過程了,因此可以直接中模式串的第0位開始匹配,像這樣:

abcabcdabddabcdabc

abcdabc

↑我們接著繼續匹配:

abcabcdabddabcdabc

abcdabc

↑發現d和c不同,再根據next陣列k-1位即第二個b的值2,我們可以接下從第二位(下標從0開始)開始匹配,像這樣:

abcabcdabddabcdabc

abcdabc

↑繼續按上述方法匹配直到找到匹配的串為止,找不到返回-1

abcabcdabddabcdabc

abcdabc

↑下面是對應的**:

public

class solution

if (p.charat(i) == p.charat(k))

next[i] = k;}}

public

static

intkmp(string t, string p)

if (t.charat(i) == p.charat(k))

if (k == pl)

}return -1;

}public

static

void

main(string args)

}

KMP演算法之我見

預備談談下面這些,可能有補充 kmp演算法的用途 kmp演算法之前的暴力 kmp演算法預備知識與概念 kmp演算法模板 kmp演算法的習題。主要用於模式匹配 字串匹配 給定乙個長的字串 target string 和乙個短的字串 pattern string 要求判斷pattern string是否...

包子演算法之我見

幾天前發了乙個部落格,包子演算法,討論很熱烈,今天我來說說我的看法 首先,我們從問題的特點分析一下 1 包子製作的工藝上,菜包子和肉包子有不同,肉包子蒸的時間要更長,且在蒸的過程中一般不會打斷,換包子這種情況,代價太大。2 從購買者的角度上看,購買者的需求各異,搭配購買的概率比較大,只賣一種包子的雖...

BPE演算法之我見

bpe演算法本質是基於合併的,而不是基於切分的,理解這一點很重要。在bpe整個迭代的過程中,是基於 詞表 的,但是最後要生成的是 子詞表 拿來用的也是 子詞表 拿 裡的例子來說,最開始詞表長這樣 l o w 5 l o w e r 2 w i d e s t 6 n e w e s t 3 如果你不...