串的兩種模式匹配算法


  模式匹配(模范匹配):子串在主串中的定位稱為模式匹配或串匹配(字符串匹配) 。模式匹配成功是指在主串S中能夠找到模式串T,否則,稱模式串T在主串S中不存在。

  以下介紹兩種常見的模式匹配算法:

  1. Brute-Force模式匹配算法 暴風算法,又稱暴力算法。

  算法的核心思想如下:
  設S為目標串,T為模式串,且不妨設:
  S=“s0s1s2…sn-1” , T=“t0t1t2 …tm-1”
  串的匹配實際上是對合法的位置0≦i≦n-m依次將目標串中的子串s[i…i+m-1]和模式串t[0…m-1]進行比較:

  • 若s[i…i+m-1]=t[0…m-1]:則稱從位置i開始的匹配成功,亦稱模式t在目標s中出現;
  • 若s[i…i+m-1]≠t[0…m-1]:從i開始的匹配失敗。位置i稱為位移,當s[i…i+m-1]=t[0…m-1]時,i稱為有效位移;當s[i…i+m-1] ≠t[0…m-1]時,i稱為無效位移。

  算法實現如下:

  (筆者偷懶,用C#實現,實際上C# String類型已經封裝實現了該功能)

 1 public static Int32 IndexOf(String parentStr, String childStr)
 2         {
 3             Int32 result = -1;
 4             try
 5             {
 6                 if (parentStr.Length > 1 && childStr.Length > 1)
 7                 {
 8                     Int32 i = 0;
 9                     Int32 j = 0;
10                     while (i < parentStr.Length && j < childStr.Length)
11                     {
12                         if (parentStr[i] == childStr[j])
13                         {
14                             i++;
15                             j++;
16                         }
17                         else
18                         {
19                             i = i - j + 1;
20                             j = 0;
21                         }
22                     }
23                     if (i < parentStr.Length)
24                     {
25                         result = i - j;
26                     }
27                 }
28             }
29             catch (Exception)
30             {
31                 result = -1;
32             }
33             return result;
34         }

  該算法的時間復雜度為O(n*m) ,其中n 、m分別是主串和模式串的長度。

  2.KMP算法,該算法是對上述暴風算法的一種改進實現算法,其改進之處在於:

  每當一趟匹配過程出現字符不相等時,主串指示器不用回溯,而是利用已經得到的“部分匹配”結果,將模式串的指示器向右“滑動”盡可能遠的一段距離后,繼續進行比較。核心思想:“利用已經部分匹配這個有效信息,保持i指針不回溯,通過修改j指針,讓模式串盡量地移動到有效的位置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM