一、BF算法的基本思想

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

二、算法代码

 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算法可能会频繁地回溯,工作效率不会很高。

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(34)-文章发布系统①-简要分析
  2. Linux UserSpace Back-Door、Rootkit SSH/PAM Backdoor Attack And Defensive Tchnology
  3. 如果 if - 迈克.杰克逊的墓志铭
  4. android shape详解
  5. java编程之:org.apache.commons.lang3.text.StrTokenizer
  6. 35、Android 性能优化、内存优化
  7. SQL经典笔试题之一
  8. HDU 1024 DP Max Sum Plus Plus
  9. CentOS 6.8安装Python2.7.13
  10. Kaggle Bike Sharing Demand Prediction – How I got in top 5 percentile of participants?
  11. python语言学习3 ——第一个python程序
  12. atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系
  13. Vim正则通配符使用心得
  14. 软AP的实现------dhcpserver交叉编译
  15. APP自动化框架LazyAndroid使用手册(1)--框架简介
  16. Linux - 用make进行工程编译
  17. java中的数组二分法
  18. oracle nvl,nvl2,coalesce几个函数的区别
  19. $.ajax的标准写法
  20. Python cffi学习

热门文章

  1. 在linux查询本机的公网IP
  2. python 爬虫新手入门教程
  3. 关于当前PHP脚本运行时系统信息相关函数
  4. 一起搞懂PHP的错误和异常(三)
  5. DS博客作业05--查找
  6. (一)es 概述与安装
  7. turtle setup和screensize
  8. 鸿蒙内核源码分析(CPU篇) | 整个内核就是一个死循环 | 祝新的一年牛气冲天 ! | v32.02
  9. AT4518-[AGC032C]Three Circuits【欧拉回路】
  10. Mysql 5.7版本,所有的坑,这里都有