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