字串匹配KMP演算法

2021-07-02 06:30:27 字數 1345 閱讀 5489

問題:給定乙個字串a,要求在a中查詢乙個字串b。

例如,主串t=」cabcabcabcabd」,模式串p=」abcabd」

令i,j分別指向主串和模式串中字元的位置。

最基礎的解法(bf演算法),i,j置為0,每一次迴圈,主串從位置i開始,模式串從位置j開始,依次比較字元是否匹配,當t[i]==p[j]時,繼續比較下乙個字元,當t[i]!=p[j]時,i退回到i-j,即開始比較的位置+1,j退回到0,即下一次從模式串的起始位置重新開始比較。這樣的時間複雜度是o(m*n)。kmp演算法通過利用已知的匹配資訊,可減少後面匹配的計算量。

kmp演算法先利用乙個陣列next儲存字首和字尾最長的相同字元個數,next[k]儲存模式串p[0…k-1]中字首和字尾最長相同的字元個數,即next[k]=q表示p[0,q-1]==p[k-q,k-1],定義next[0]=-1,例如對於模式串p=」abcabd」,next[5]=2。採用kmp演算法比較字元,當t[i]!=p[j]時,由於記錄了子串p[0,j-1]中字首和字尾相同的字元數,i可以不進行回退,j回退到next[j],因為已匹配的字串p[0,j-1]中,p[j-1-next[j],j-1]與p[0,next[j]-1]相同,而p[j-1-next[j],j-1]與主串t[i-1-next[j],i-1]是匹配的,那麼p[0,next[j]-1]與t[i-1-next[j],i-1]也是匹配的,所有下一次比較只需要從p[next[j]]與t[i]開始。另外,當j==0即發生不匹配的情況時,需要++i,將next[0]置為-1以考慮該情況。

求next陣列

可使用遞推思想來計算:

next[0]=-1,假設next[j]=k,即p[0,k-1]==p[j-k,j-1]

(1)若p[j]==p[k],那麼next[j+1]=next[j]+1

(2)若p[j]!=p[k],那麼將問題轉化為尋找與字首相同的子串問題,利用kmp演算法,k=next[k],重新開始比較。

**如下

int kmpsearch(const char* psrc, int slen, const char* patnstr, int plen)

if (j==plen)

else

}delete nextindexarr;

nextindexarr=null;

return substrindex;

}void getnextindex(const char* pstr,int len,int* nextindexarr)

else}}

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的第乙個字元,依次比較下去,直到得出最後的匹配...