yishujixiaoxiao 2019-11-05
BF(Brute Force)算法是模式匹配中最简单、最直观的算法。该算法最基本的思想是从主串的第 start 个字符起和模式P(要检索的子串)的第1个字符比较,如果相等,则逐个比较后续字符;比较过程中一旦发现不相等的情况,则回溯到主串的第 start+1 个字符位置,重新和模式P的字符进行比较。

package algorithm;
import java.util.Scanner;
/**
* 字符串匹配算法:BF
*/
public class BF {
// 主串
private String s1;
// 目标串
private String s2;
/**
* 控制台输入主串、目标串
* 使用{@link Scanner#nextLine}能接收当前行(非结尾的)的其余部分,包括空格。
* 当然使用Scanner是其中的一种方法。
*/
public void read() {
// 输入主串
System.out.println("请输入主串: ");
Scanner scan = new Scanner(System.in);
// 输入要匹配得字符
System.out.println("请输入目标串: ");
Scanner aim = new Scanner(System.in);
if (scan.hasNext()) {
s1 = scan.nextLine();
System.out.println("输入的主串为:" + s1);
}
if (aim.hasNext()) {
s2 = aim.nextLine();
System.out.println("输入的目标串为:" + s2);
}
if (s1.length() < s2.length()) {
System.out.println("主串长度必须大于目标串,请重新输入!");
read();
}
// 关闭
scan.close();
aim.close();
}
/**
* 字符串匹配算法BF,算法平均时间复杂度为O((n-m)m),n为主串长度,m为目标串长度。
*
* @param start 从主串的start位置开始匹配
* @return true 匹配成功,反之失败
*/
public boolean bf(int start) {
read(); // 输入主串,目标串参数
int i, j;
for (i = start; i < s1.length() - s2.length(); ) {
for (j = 0; j < s2.length(); j++) {
if (s1.charAt(i) != s2.charAt(j)) {
i++;
break; // 从主串下一个字符重新开始找起,就像回溯
} else {
i++; // 匹配成功,开始对比两个串的下一个字符
}
// 目标串匹配完后,返回会匹配成功的结果
if (j == s2.length() - 1) {
return true;
}
}
}
return false;
}
}BF算法平均时间复杂度为O((n-m)m),n为主串长度,m为目标串长度。BF算法可能会频繁地回溯,工作效率不会很高。