字符串與模式匹配算法(一):BF算法

1、BF算法的基本思想

  BF(Brute Force)算法是模式匹配中最簡單、最直觀的算法。該算法最基本的思想是從主串的第 start 個字符起和模式P(要檢索的子串)的第1個字符比較,若是相等,則逐個比較後續字符;比較過程當中一旦發現不相等的狀況,則回溯到主串的第 start+1 個字符位置,從新和模式P的字符進行比較。java

2、算法代碼

 1 package algorithm;
 2 
 3 import java.util.Scanner;
 4 
 5 /**
 6  * 字符串匹配算法:BF
 7  */
 8 public class BF {
 9     // 主串
10     private String s1;
11     // 目標串
12     private String s2;
13 
14     /**
15      * 控制檯輸入主串、目標串
16      * 使用{@link Scanner#nextLine}能接收當前行(非結尾的)的其他部分,包括空格。
17      * 固然使用Scanner是其中的一種方法。
18      */
19     public void read() {
20         // 輸入主串
21         System.out.println("請輸入主串: ");
22         Scanner scan = new Scanner(System.in);
23         // 輸入要匹配得字符
24         System.out.println("請輸入目標串: ");
25         Scanner aim = new Scanner(System.in);
26         if (scan.hasNext()) {
27             s1 = scan.nextLine();
28             System.out.println("輸入的主串爲:" + s1);
29         }
30         if (aim.hasNext()) {
31             s2 = aim.nextLine();
32             System.out.println("輸入的目標串爲:" + s2);
33         }
34 
35         if (s1.length() < s2.length()) {
36             System.out.println("主串長度必須大於目標串,請從新輸入!");
37             read();
38         }
39 
40         // 關閉
41         scan.close();
42         aim.close();
43     }
44 
45     /**
46      * 字符串匹配算法BF,算法平均時間複雜度爲O((n-m)m),n爲主串長度,m爲目標串長度。
47      *
48      * @param start 從主串的start位置開始匹配
49      * @return true 匹配成功,反之失敗
50      */
51     public boolean bf(int start) {
52         read(); // 輸入主串,目標串參數
53         int i, j;
54         for (i = start; i < s1.length() - s2.length(); ) {
55             for (j = 0; j < s2.length(); j++) {
56                 if (s1.charAt(i) != s2.charAt(j)) {
57                     i++;
58                     break;  // 從主串下一個字符從新開始找起,就像回溯
59                 } else {
60                     i++;    // 匹配成功,開始對比兩個串的下一個字符
61                 }
62                 // 目標串匹配完後,返回會匹配成功的結果
63                 if (j == s2.length() - 1) {
64                     return true;
65                 }
66             }
67         }
68         return false;
69     }
70 
71 }

  BF算法平均時間複雜度爲O((n-m)m),n爲主串長度,m爲目標串長度。BF算法可能會頻繁地回溯,工做效率不會很高。算法

相關文章
相關標籤/搜索