字串的匹配演算法

2022-07-26 02:42:08 字數 1428 閱讀 2660

簡單的說,就是對主串的每乙個字元作為字串的開頭,與要匹配的字串進行匹配。對主串做大迴圈,每個字元開頭做字串的長度的小迴圈,直到匹配成功或者全部遍歷為止。

讓我們來分析一下,最好的情況是什麼?那就是第一開始就成功,時間時間複雜度為o(1) ;最壞呢,就是每次迴圈到子串最後一位才發現不對,時間複雜度為o((n-m+1)*m)

效率確實太低

於是就有了下面的演算法

避免不必要的回溯

比如 a = "abcabcabc"   t = "abcabx"

迴圈到 j = 6 時發現錯誤,這時t中,有兩個ab,如果按樸素模式的化此時 j = 2;但是,剛才我們已經遍歷過 a[2] = t[2] = b 不可能再等於 t[2] ,要避免這多餘的回溯,如果 j 應該等於3

應該t中 t[1-2] = t[4-5] 而第 6為失敗,說明檢測第6位時應該跳過t[1-2] 使得 j = 3;

abcabcabc

abcabx

abcabx  從c開始匹配

這時就需要乙個next 陣列來記錄 j 該是什麼

next[j] = 1 到 j-1 中 字首 和 字尾 相同字母的個數+1

下面是 構造next陣列的**: ///盡力了。。

void getnext(string s,int

next)

else

//不同 則 找 和前j項 能組成的最大公共長度,

//而前j項最大字串為next[j] 則判斷第next[j]+1項和i是否相同,

//next[j]+1項的下標為next[j]}}

kmp函式就比較簡單 和樸素演算法相同 只是 小迴圈 回溯時發生了變化 

int kmp(string s,string p,int

next)

else

}if(j==plen)

else

}

完整**

#include#include

#include

using

namespace

std;

void getnext(string s,int

next)

else

//不同 則 找 和前j項 能組成的最大公共長度,

//而前j項最大字串為next[j] 則判斷第next[j]+1項和i是否相同,

//next[j]+1項的下標為next[j]

}}int kmp(string s,string p,int

next)

else

}if(j==plen)

else

}int

main()

;

int flag =kmp(s,p,next);

cout

return0;

}

view code

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

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

字串匹配演算法

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

字串匹配演算法

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