資料結構梳理04 串的模式匹配 KMP演算法

2022-09-10 10:33:23 字數 1054 閱讀 3003

一、串的模式匹配

設有兩個串s和pat,若在s中查詢是否有與pat相同的子串,則稱串s為目標,稱pat為模式,串的模式匹配即為查詢模式串在目標串中的匹配位置的運算。

(1)樸素的模式匹配(b-f演算法)

樸素的模式匹配想法十分簡單粗暴:將pat中的每個字元依次與s中的字元比較,如果某一位匹配失敗,則將pat右移一位,用pat中的字元從頭開始與s中的字元比較,重複上述步驟,直到出現以下兩種情況演算法結束: 

①在某一趟匹配中pat與s的某一子串匹配成功,則函式返回pat在當前串中第一次匹配的位置,匹配成功;

②pat已經移到最後可能與s比較的位置(即pat的最後乙個字元已經對應到s的最後乙個字元的位置)後pat仍不能與s匹配,則返回-1,表示匹配失敗。

b-f演算法匹配過程示意圖:

**實現:

int string::find(string& pat,int k)const

}

**如下:

如果a=b,那麼f[j]=f[j-1]+1;

如果a≠b,那麼我們就需要在已經找到的兩個相等的字首和字尾子串中再去尋找更小的相同的前、字尾子串,就是上右圖中的z,如果c=b,那麼f[j]=f[f[j-1]]+1;如果c≠b,那麼就要在z中繼續找相同的前、字尾子串,重複上述步驟,直到所有的可能子串已經全部被找到,但仍然沒有滿足條件的子串,那麼f[j]=-1。

轉化為數學公式:

kmp效能分析:由於指標不回溯,目標串中的每乙個字元最多掃瞄一遍,故時間複雜度為o(lengthp+lengths)。

資料結構04 串的樸素匹配

在串的問題裡,匹配是很重要的一類問題。匹配是在乙個給定的主串中尋找乙個相同的子串,確定子串出現的位置。乙個樸素的做法是,將主串和子串逐字元比較。用指標移動兩字元。步驟如下 1 有兩指標,其中乙個i指向主串查詢的位置,另外j乙個指標指向子串的首位。2 比較兩指標所指的字元。如果相同,兩指標都移動一位。...

資料結構2 2串的模式匹配

子串在主串中的定位操作稱為串的模式匹配,記為index s,t,pos 即在主串s中,從第pos個字元開始查詢與子串t第一次相等的位置。若查詢成功,則返回子串t的第乙個字元在主串中的位序,否則返回0。其中主串稱為目標串,子串稱為模式串。基本思想 從目標串的第pos個字元開始與模式串的第乙個字元比較,...

資料結構 字串 模式匹配

我們先把模式串標出序號 接著把模式串所有字首依次列出來 接下來把每乙個子串相等的字首和字尾的最大長度求出,舉個例子 abaab 觀察子串,前字尾ab相同,因此返回2 5.依次類推,我們可以得到每乙個子串對應的一組序列 當時這組資料並不是所要求的next陣列,可以將其稱為部分匹配值表,相應c 如下 獲...