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 如果你不...