程式設計思想板塊最主要的內容是資料結構經典題目及解答題目所需的程式設計思想,願對您能有所幫助
四、串的模式匹配
1)樸素模式匹配演算法(暴力演算法)
-
主串稱目標串,子串稱模式串
-
演算法思想:逐個比對字元
-
無論鏈式/順序:最壞時間複雜度為:O(mn) (n,m分別是主串和模式串長度)
最好時間複雜度:O(n)(即每次比對都在第一個字元處失敗)
最壞比較字元總次數:m*(n-m+1)
2)KMP演算法
-
演算法思想:算出PM表然後依據此表移動模式串和模式串指標的位置
-
子串右移位數 = 已匹配的字元數 - 對應的部分匹配值
-
需注意的點:
① PM表會右移一位(第一個元素右移後空缺用-1填充)使之用next[j]就可以取到子串指標j將要指向的位置
② next陣列計算看王道串的課後習題
③ 為了讓公式更簡潔,如果串的位序是從1開始的,則next陣列才需要整體加1,若是從0開始的則不用
④ next[j]的含義:在發生失配時,子串指標跳到子串的next[j]位置重新與主串當前位置進行比較(主串指標回溯-KMP優點)
⑤ 時間複雜度:O(m+n);
求next陣列:O(m)
⑥
(1) :
- KMP演算法進一步優化:如果出現了(P為子串)時,用next陣列中符合此條件的從左至右把前面的字元的next值賦給後一個