串的模式匹配演算法

2021-06-09 16:25:33 字數 2311 閱讀 7391

子串的定位操作通常稱做串的模式匹配,這也是串的乙個很要的操作。

一,一般定位子串位置演算法

演算法基本思想:從主串的第1個字元起和模式的第乙個字元進行比較,若相等,則再比較主串和模式串的後續字元。否則將主串的後續字元和模式串的第乙個字元進行比較,在網上找的一張:

return i-t.length; // 找到返回

else

return 0; // 沒有找到

}1,若過程中比較失敗,子串從頭開頭重新匹配j=0;,而主串從子串已經比較的後續字元開始,i=i-j+1。

2,若過程中比較乙個字元成功之後,兩個串都移至後續字元,i++,j++。

3,若結果查詢成功,那麼j的值一定比t.length大1,並且i-t.length就是查詢成功之後在主串的位置。否則就是查詢失敗。

4,可以知道這種演算法在最壞的時候,時間複雜度為o(t.length*s.length).

二,kmp演算法

這是一種改進的模式串匹配演算法,和前一種演算法相比,該演算法可以在o(t.length+s.length)時間複雜度內完成。這種改進的思想主要是:每當一趟匹配過程中出現的字元不等時,我們不需要將i的值重新設定為i=i-j+1; 而是利用之前已經得到的一部分匹配【就是前面j個字元已經相等】的結果,將模式向右移動盡可能遠的一段距離,然後再進行比較,這樣i的值就可以不用移動,只要移動j的值就可以了。

換句話說就是當主串的第i個字元與子串的第j個字元不相等時,主串的第i個字元如果不回溯的話,應該與子串模式中的哪個字元再進行比較。

下面討論怎麼做到這一點的。

演算法圖示:

演算法分析 

2.1 主串的第i個字元接下來與模式串的哪個字元進行比較

假設模式和主串正在比較第k個字元,那麼前面k-1個字元必然已經比較成功,也就是滿足這個關係:

這裡所要表達的意思就是:若模式串中存在滿足上面3中條件的兩個子串,則當匹配過程中,主串中第i人字元與模式中第j個字元比較不相等時,只需要將模式向右移動至模式中第k個字元和主串中第i個字元對齊,因為模式串中的頭k-1個字元肯定與主串中的第i個字元 之前的k-1個字元相等,所以,匹配只需要從模式中第k個字元與主串中第i個字元比較,就可以進行後續比較操作。我們定義若模式串中第j個字元不相等,然後從第k個字元開始比較這種關係,即next[j] = k .

2.2 next[j] = k 求解

next[j] 的定義如下【這是資料結構書籍上的定義】

假定下標從1開始。

假設next[j]=k,這表明存在"p1…pk-1」=「pj-k+1…pj-1"這樣的關係,此時next[j+1]的值如何計算呢?分下面兩種情況:

1)若pk=pj,則有「p1…pk-1pk」=「pj-k+1…pj-1pj」 ,如果在j+1發生不匹配,說明next[j+1] = k+1 = next[j]+1。

2)  若pk≠pj,可把求next值問題看成是乙個模式匹配問題,整個模式串既是主串,又是子串:

(1)若pk』=pj,則有「p1…pk』」=「pj-k』+1…pj」,next[j+1]=k』+1=next[k]+1=next[next[j]]+1.

(2)若pk」=pj ,則有「p1…pk」」=「pj-k」+1…pj」,next[j+1]=k」+1=next[k』]+1=next[next[k]]+1.

......

(n)當無任何k'滿足等式時,next[j+1]=1.

void get_next(sstring t, int *next) 

else

if(j>t.length)

return i-t.length;

else

return 0;

}

可以看到這和一般的匹配演算法,有兩個區別:

1)匹配失配後,主串不是重新回溯,而是將子串往右滑動,以找到乙個合適的點,再進行比較。

2)當比較字元成功或者是包含當前位置的子串不存在時,將主串移至下乙個位置。

串的模式匹配演算法

串的模式匹配演算法 子串的定位操作通常稱作串的模式匹配。通常用函式index s,t,pos 來求解,其中s為主串,t為模式串,pos為主串中的位置,整個函式的作用是返回在字串s中的第pos個字元及以後 包含pos 首次出現與字串t相匹配的子串的第乙個字元的位置。例如 s abciu 5 abcjk...

串的模式匹配演算法

1 求子串位置的定位函式 子串的定位操作通常稱做串的模式匹配,是各種串處理系統中最重要的操作之一。現採用定長順序儲存結構,可以寫出簡單匹配演算法。int index sstring s,sstring t,int pos else if j t 0 return i t 0 else return ...

串的模式匹配演算法

1 brute force模式匹配演算法 暴力匹配 如果用暴力匹配的思路,並假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置,則有 如果當前字元匹配成功 即s i p j 則i j 繼續匹配下乙個字元 如果失配 即s i p j 令i i j 1 j 0。相當於每次匹配失敗時,i 回溯,j...