由字串匹配到KMP演算法

2021-07-25 18:58:32 字數 1553 閱讀 4999

字串匹配問題就是在指對於兩段字串,待匹配串和模式串,尋找待匹配串中模式串是否出現,及出現的位置。

例如在文字編輯中,我們經常要在一段文字中某個特定的位置找出某個特定的字元或模式。

1、簡單字串匹配(bf-brute force演算法)

這個演算法簡單粗暴,就是從左邊對齊乙個個字元對比,相同就對比下一位,不同的話模式串就整體右移一位,再乙個個字元對比,直到右邊對齊~

int

match(string& target, string& pattern)

else

}if(pattern_index == pattern_length)//pattern遍歷到了最後一位

return target_index - pattern_length;

else

//target遍歷到了最後一位

return -1;

}

演算法複雜度是o(target_length*pattern_length)~~

2、stl字串匹配函式~~string::

find():在乙個字串中查詢乙個指定的單個字元或字元陣列。如果找到,就返回首次匹配的開始位置;如果沒有查詢到匹配的內容,就返回string::npos。

find_first_of():在乙個目標串中進行查詢,返回值是第乙個與指定字元組中任何字元匹配的字元位置。如果沒有查詢到匹配的內容,則返回npos。

find_last_of():在乙個目標串中進行查詢,返回最後乙個與指定字元組中任何字元匹配的字元位置。如果沒有查詢到匹配的內容,則返回npos。

rfind():對乙個串從尾至頭查詢乙個指定的單個字元或字元組。如果找到,就返回首次匹配的開始位置;如果沒有查詢到匹配的內容,則返回npos。

find(string, int):第乙個引數用來指示要查詢的字元,第二個引數用來表示從字串的何處開始查詢子串(預設的查詢位置是0)。

3、kmp演算法

第一步中的簡單匹配演算法可用下圖來表示~遇到不匹配就從頭開始重新匹配,index代表移動的位數~

很明顯會發現,從0到1這一步是多餘的,因為target的第一位和pattern的第一位相匹配而與第二位顯然不匹配,這一步我們在index=0時已經做了,所以如果將已經匹配了部分的字串分析一下,再決定移動多少位會大大降低複雜度。

假設對於pattern中的部分已匹配字串

存在最大的k,使0~k的字串與j-k~j的字串相同,我們稱為最大公共前字尾。比如在index=0的匹配中,k=2,pattern右移(5(已匹配字串字元數)-3(最大公共前字尾數))位。這樣的移位可最大程度地使(與字尾相同)字首覆蓋已匹配的字尾,移位後字首將不需要在進行匹配,整個優化後的過程如下圖所示~

所以整個kmp演算法的核心在於,如何計算k

這裡寫**片

KMP演算法 字串匹配

kmp演算法基本思想 我們在用常規的思想做 字串匹配時候是 如 對如 字元如果 t abab 用p ba 去匹配,常規思路是 看 t 第乙個元素 a 是否 和p 的乙個 b 匹配 匹配的話 檢視各自的第二個元素,不匹配 則將 t 串的 第二個元素開始 和 p 的第乙個匹配,如此 一步一步 的後移 來...

KMP字串匹配演算法

kmp核心思想 計算模式串的next陣列,主串的索引在比較的過程中不回朔 ifndef kmp h define kmp h class kmp endif include kmp.h include include include using namespace std int kmp calcu...

KMP字串匹配演算法

在介紹kmp演算法之前,先介紹一下bf演算法。一.bf演算法 bf演算法是普通的模式匹配演算法,bf演算法的思想就是將目標串s的第乙個字元與模式串p的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和p的第二個字元 若不相等,則比較s的第二個字元和p的第乙個字元,依次比較下去,直到得出最後的匹配...