字符串与模式匹配算法(一):BF算法
一、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算法可能会频繁地回溯,工作效率不会很高。
字符串与模式匹配算法(一):BF算法的更多相关文章
- 常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)
相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟 ...
- 串的模式匹配算法1 BF算法
BF算法 字符串的模式匹配不一定要从主串的第一个位置开始,可以指定主串中查找的起始位置 pos. 2. 算法步骤: 1)分别利用计数器指针 i 和 j 指定主串和模式串即小字符串待比较的位置,初始化为 ...
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
- 字符串模式匹配算法1 - BF和KMP算法
在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...
- 字符串与模式匹配算法(二):MP算法
一.MP算法介绍 MP 算法(Morris-Pratt算法)是一种快速串匹配算法,它是詹姆斯·莫里斯(James Morris)和沃恩·普莱特(Vaughan Pratt)在1970年提出的一种快速匹 ...
- 数据结构4_java---顺序串,字符串匹配算法(BF算法,KMP算法)
1.顺序串 实现的操作有: 构造串 判断空串 返回串的长度 返回位序号为i的字符 将串的长度扩充为newCapacity 返回从begin到end-1的子串 在第i个字符之前插入字串str 删除子串 ...
- 字符串的模式匹配算法——KMP模式匹配算法
朴素的模式匹配算法(C++) 朴素的模式匹配算法,暴力,容易理解 #include<iostream> using namespace std; int main() { string m ...
- 字符串模式匹配算法2 - AC算法
上篇文章(http://www.cnblogs.com/zzqcn/p/3508442.html)里提到的BF和KMP算法都是单模式串匹配算法,也就是说,模式串只有一个.当需要在字符串中搜索多个关键字 ...
- 字符串与模式匹配算法(六):Needleman–Wunsch算法
一.Needleman-Wunsch 算法 尼德曼-翁施算法(英语:Needleman-Wunsch Algorithm)是基于生物信息学的知识来匹配蛋白序列或者DNA序列的算法.这是将动态算法应用于 ...
随机推荐
- elasticsearch入门到放弃之elasticsearch-head
elasticsearch-head可理解为跟DBeaver一样是一个数据可视化工具,但是这个工具并没有理想中那么好用坑也是很多,我已经在我的github上fork了一份修改后的版本:https:// ...
- ldconfig与 /etc/ld.so.conf
现在我们知道了动态与静态函数库,也知道了当前的Linux大多是将函数库做成动态函数库,下面来讨论增加函数库读取性能的方法.我们知道,内存的访问速度是硬盘的好几倍,所以,如果将常用的动态函数库加载到内存 ...
- Android——菜单(Menu)
菜单的运用在Android中很常见,今天就两节体育课,闲下来也想认真的学一学,正好项目中也会有应用.我是跟着菜鸟教程进行学习的,我相应的粘了一些我自己认为比较重要的,以供方便记录学习. 本章给大家带来 ...
- 消息队列之 kafka 集群搭建
我们先弄清楚kafka集群环境首先需要些什么 JDK 10+ Zookeeper Kafka 2.x 首先准备三台虚拟机 centos7 ,更改IP地址为静态地址分别为,29.30.31 cd /et ...
- ecshop后台设置模板的地方显示自己新建模板的操作界面
我建立了一个叫test.dwt文件怎样在后台设置模板里面出现呢.1首先找到ecshop目录下的languages\zh_cn\admin/template.php 这个php文件 当然如果这只是简体中 ...
- iOS之内存管理-字节对齐
字节对齐 1 struct Mystruct1{ 2 char a; //1字节 3 double b; //8字节 4 int c; //4字节 5 short d; //2字节 6 }Mystru ...
- Linux文件(夹)属性与权限
文件属性与权限,文件权限设置 参考资料:鸟哥的Linux私房菜 用户与用户组 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这 ...
- 如何使用jemeter进行性能测试
下载链接:http://jmeter.apache.org/download_jmeter.cgi 一:如何使用jemeter进行压测 1)稳定性测试就需要长时间运行,其运行时间1天.2天.一周等 2 ...
- python学习1-博客-DB操作类
#学习python,准备写一个博客,第一天:在别人代码基础上写一个数据库操作的db.py1)python代码 #!/usr/bin/env python # -*- coding: UTF-8 -*- ...
- [模板]多项式全家桶小记(求逆,开根,ln,exp)
前言 这里的全家桶目前只包括了\(ln,exp,sqrt\).还有一些类似于带余数模,快速幂之类用的比较少的有时间再更,\(NTT\)这种前置知识这里不多说. 还有一些基本的导数和微积分内容要了解,建 ...