字串匹配演算法 KMP演算法

2021-09-07 20:51:23 字數 3225 閱讀 2633

kmp演算法是一種改進的字串匹配演算法。kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現乙個next()函式,函式本身包含了模式串的區域性匹配資訊。

下面從乙個例子來了解kmp演算法:字串"bbc abcdab abcdabcdabde",我想知道,裡面是否包含另乙個字串"abcdabd"?

下面是**:

1、首先,字串"bbc abcdab abcdabcdabde"的第乙個字元與搜尋詞"abcdabd"的第乙個字元,進行比較。因為b與a不匹配,所以搜尋詞後移一位。

2、因為b與a不匹配,搜尋詞再往後移。

3、就這樣,直到字串有乙個字元,與搜尋詞的第乙個字元相同為止。

4、接著比較字串和搜尋詞的下乙個字元,還是相同。

5、直到字串有乙個字元,與搜尋詞對應的字元不相同為止。

6、這時,最自然的反應是,將搜尋詞整個後移一位,再從頭逐個比較。這樣做雖然可行,但是效率很差,因為你要把"搜尋位置"移到已經比較過的位置,重比一遍。

8、怎麼做到這一點呢?可以針對搜尋詞,算出一張《部分匹配表》(partial match table)。這張表是如何產生的,後面再介紹,這裡只要會用就可以了。

9、已知空格與d不匹配時,前面六個字元"abcdab"是匹配的。查表可知,最後乙個匹配字元b對應的"部分匹配值"為2,因此按照下面的公式算出向後移動的位數:

移動位數 = 已匹配的字元數 - 對應的部分匹配值

因為 6 - 2 等於4,所以將搜尋詞向後移動4位。

11、因為空格與a不匹配,繼續後移一位。

12、逐位比較,直到發現c與d不匹配。於是,移動位數 = 6 - 2,繼續將搜尋詞向後移動4位。

14、下面介紹《部分匹配表》是如何產生的。

首先,要了解兩個概念:"字首"和"字尾"。 "字首"指除了最後乙個字元以外,乙個字串的全部頭部組合;"字尾"指除了第乙個字元以外,乙個字串的全部尾部組合。

15、"部分匹配值"就是"字首"和"字尾"的最長的共有元素的長度。以"abcdabd"為例,

- "a"的字首和字尾都為空集,共有元素的長度為0;

- "ab"的字首為[a],字尾為[b],共有元素的長度為0;

- "abc"的字首為[a, ab],字尾為[bc, c],共有元素的長度0;

- "abcd"的字首為[a, ab, abc],字尾為[bcd, cd, d],共有元素的長度為0;

- "abcda"的字首為[a, ab, abc, abcd],字尾為[bcda, cda, da, a],共有元素為"a",長度為1;

- "abcdab"的字首為[a, ab, abc, abcd, abcda],字尾為[bcdab, cdab, dab, ab, b],共有元素為"ab",長度為2;

- "abcdabd"的字首為[a, ab, abc, abcd, abcda, abcdab],字尾為[bcdabd, cdabd, dabd, abd, bd, d],共有元素的長度為0。

16、"部分匹配"的實質是,有時候,字串頭部和尾部會有重複。比如,"abcdab"之中有兩個"ab",那麼它的"部分匹配值"就是2("ab"的長度)。搜尋詞移動的時候,第乙個"ab"向後移動4位(字串長度-部分匹配值),就可以來到第二個"ab"的位置。

1 usingunityengine;

2 usingsystem.collections; 3 4 public classkmp 5 23 if (_chars[i] ==_chars[_index]) 24 27 _next[i] =_index; 28 } 29 return_next; 30 } 31 32 /// 33 ///判斷 _mainstr 字串是否包含 _modestr 字串 34 ///

35 /// 主字串

36 /// 模板字串

37 ///

38 public static bool containstring(string _mainstr, string_modestr) 39 50 if (_modechars[_index] ==_mainstr[i]) 51 54 if (_index ==_modechars.length) 55 59 } 60 return false; 61 } 62 }

**看不懂的可以自己通過斷點理一下。

kmp還有乙個優化後的版本,還有待研究。待續。。。

字串匹配演算法KMP演算法

資料結構中講到關於字串匹配演算法時,提到樸素匹配演算法,和kmp匹配演算法。樸素匹配演算法就是簡單的乙個乙個匹配字元,如果遇到不匹配字元那麼就在源字串中迭代下乙個位置乙個乙個的匹配,這樣計算起來會有很多多餘的不符合的匹配做了冗餘的比較。假設源字串長n,字串長m 該演算法最差時間複雜度為 m n m ...

字串匹配演算法(KMP演算法)

力扣 實現 strstr 函式。給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。int strstr char haystack,char needle else if j n len...

字串匹配演算法 KMP演算法

核心思想 kmp 演算法就是在試圖尋找一種規律 在模式串和主串匹配的過程中,當遇到壞字元後,對於已經比對過的好字首,利用字串的特點,盡可能多滑動幾位,提高效率 聽起來好像和bm演算法差不多 演算法講解 kmp演算法與bm演算法最大的不同在兩點 1 從前往後匹配 2 利用好字首的前字尾子串最長匹配規則...