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算法

 

posted @ 2016-10-30 17:31  我所向往的美好  阅读(5510)  评论(0编辑  收藏