模式匹配
在字符串匹配問題中,我們期待察看源串 “ 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算法
