字串匹配演算法

2021-07-11 18:42:38 字數 2943 閱讀 9199

演算法的改進主要是針對如果出現不匹配字元,應該怎樣回退的問題

在母字串中找子字串,如果找到返回字串在母字串中的位置,如果沒有找到,返回-1。

參見 leetcode 28. implement strstr()

逐個跟字串匹配。

失敗則子串向前移動一位,繼續比較

順序匹配字串與母串的每乙個字元

- 如果達到子字串末尾,就返回母串中子串首字元對應位置

- 如果遇到不匹配字元就回退到子串首字元對應母串的位置的下乙個字元進行比較

public

class

solution

int p =0;

for(int i=0; iif(haystack.charat(i)==needle.charat(p))else

if(p==needle.length())

}return -1;}}

kmp演算法的核心是乙個字串回退陣列next,來確定當字元不匹配時字串的回退位置,這個陣列只與字串特徵有關,表示字首與字尾的最大匹配長度。

- 如果已匹配部分字尾與字首匹配長度為零,那就只能直接跳過已匹配部分

- 如果已匹配部分字尾與字首有匹配部分,那麼就將字串指標跳到字串已匹配部分字首與字尾最大匹配長度位置

- 如果下乙個字元還是不匹配,重複上面的跳轉,直到p為零

關鍵演算法:求next陣列求next陣列也就是求字串到當前位置的字首字尾最大匹配長度,本演算法精彩之處是用了相當於兩個字串進行匹配的方法來求字首與字尾的最大匹配長度。求下乙個最大匹配長度時

- 首先將另一字串置於字串最大匹配部分

- 如果新的字元不匹配,就找已匹配部分的最大匹配長度,然後對比新字元,就像kmp演算法匹配字串

public

class

solution

public

static

intstrstr(string haystack, string needle)

if(haystack.charat(i)==needle.charat(j))

if(j==needle.length())

}return -1;

}public

static

int getnext(string needle)

if(needle.charat(i)==needle.charat(j))

next[i] = j;

}return next;}}

public

class

demo

public

static

intindexofrk(string sub, string source)

long subhash = 0;

long hash = 0;

for (int i = 0; i < m; i++)

for (int i = 0; i <= n - m; i++)

if (i < n - m) }}

return -1;

}private

static

boolean

check(string sub, string source, int index)

}return

true;}}

(1)壞字元演算法

當出現乙個壞字元時, bm演算法向右移動模式串, 讓模式串中最靠右的對應字元與壞字元相對,然後繼續匹配。壞字元演算法有兩種情況。

case1:模式串中有對應的壞字元時,讓模式串中最靠右的對應字元與壞字元相對(ps:bm不可能走回頭路,因為若是回頭路,則移動距離就是負數了,肯定不是最大移動步數了),如下圖。

case2:模式串中不存在壞字元,很好,直接右移整個模式串長度這麼大步數,如下圖。

(2)好字尾演算法

如果程式匹配了乙個好字尾, 並且在模式中還有另外乙個相同的字尾或字尾的部分, 那把下乙個字尾或部分移動到當前字尾位置。假如說,pattern的後u個字元和text都已經匹配了,但是接下來的乙個字元不匹配,我需要移動才能匹配。如果說後u個字元在pattern其他位置也出現過或部分出現,我們將pattern右移到前面的u個字元或部分和最後的u個字元或部分相同,如果說後u個字元在pattern其他位置完全沒有出現,很好,直接右移整個pattern。這樣,好字尾演算法有三種情況,如下圖所示:

case1:模式串中有子串和好字尾完全匹配,則將最靠右的那個子串移動到好字尾的位置繼續進行匹配。

case2:如果不存在和好字尾完全匹配的子串,則在好字尾中找到具有如下特徵的最長子串,使得p[m-s…m]=p[0…s]。

case3:如果完全不存在和好字尾匹配的子串,則右移整個模式串。

(3)移動規則

bm演算法的移動規則是:

將3中演算法基本框架中的j += bm(),換成j += max(shift(好字尾),shift(壞字元)),即

bm演算法是每次向右移動模式串的距離是,按照好字尾演算法和壞字元演算法計算得到的最大值。

shift(好字尾)和shift(壞字元)通過模式串的預處理陣列的簡單計算得到。壞字元演算法的預處理陣列是bmbc,好字尾演算法的預處理陣列是bmgs。

字串匹配演算法 字串匹配演算法總覽

字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...

字串匹配演算法

首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...

字串匹配演算法

平常操作文字的時候,經常需要操作對字串進行操作。而字串中最重要的一種操作就叫匹配,字串的匹配演算法很多,人們最熟悉的莫過於kmp演算法了。今天就來談一談一些字串匹配演算法。先來說說大名鼎鼎的kmp演算法,這個演算法出現在無數的資料結構與演算法書上面。它的策略很簡單 當模式串第k個字元不匹配主串中第s...