Java數據結構之字符串模式匹配算法---Brute-Force算法


模式匹配

     在字符串匹配問題中,我們期待察看源串 “ S串 ” 中是否含有目標串 “ 串T ” (也叫模式串)。其中 串S被稱為主串,串T被稱為子串。

     1、如果在主串中查找到子串,則稱為模式匹配成功,返回模式串的第一個字符在主串中出現的位置。

     2、如果在主串中未找到子串,則稱為模式匹配失敗,返回-1。

在模式匹配過程中有兩個比較經典的算法:Brute-Force與KMP算法是兩種最經典的模式匹配算法。

在本片中主要分析BF算法,很黃很暴力。下面是簡單的思路解析:

     1.其基本思路是:從目標串s=“ s0s1…sn-1 ”的第一個字符開始和模式串t=“ t0t1…tm-1 ”中的第一個字符比較,若相等,則繼續逐個比較后續字符,否則,從目標串s的第2個字符開始重新與模式串t的第一個字符進行比較,依次類推,若從目標串s的第i個字符開始,每個字符依次和模式串t中的對應字符相等,則匹配成功,該算法返回i;否則匹配失敗,返回-1。

     2.舉個栗子:

設主串s=“cddcdc”,模式串t=“cdc”,模式匹配過程如圖:

//================================

 1 //字符串的模式匹配算法,之BF算法
 2 public class BruteForce {
 3     //
 4     /**
 5      * 
 6      * @param src
 7      *            主串
 8      * @param sub
 9      *            字串(模式串)
10      * 算法比較簡單,缺點是每一次進行回溯效率不高,回溯往往是沒有必要
11      */
12     public static int bruteFore(String src, String sub) {
13         int i = 0, j = 0;
14         int index = -1;
15         while (i < src.length() && j < sub.length()) {
16             if (src.charAt(i) == sub.charAt(j)) {
17                 i++;
18                 j++;
19             } else {
20                 /**
21                  * 這里理解一下下面的公式:該式子的目的是保證i的值在匹配不成功時不斷向后+1 j其實表示已經成功匹配的字符數,
22                  * i是一個不斷累加的過程
23                  */
24                 i = i - j + 1;
25                 j = 0;
26             }
27         }
28         // 判斷
29         if (j == sub.length()) {
30             // 此處表示在index處開始匹配,並且后面完全匹配成功
31             index = i - sub.length();
32         }
33 
34         return index;
35     }
36 }

該算法與上面的圖示例子對應,可以自己閱讀理解。

下轉KMP算法

 


免責聲明!

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



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