Brute-Force模式匹配算法

  • 一、使用while循环实现BF
  • 二、使用for循环实现BF
  • 三、测试两种实现是否正确
  • 四、总结

前言:
Brute-Force匹配算法,翻译过来可以叫暴力匹配算法,典型应用场景就是字符串的匹配问题,比如寻找一个子串在主串中第一次出现的下标。这种匹配算法的逻辑是这样的:选取主串中指定位置作为匹配的起点(这篇文章使用的是首位作为起点),将子串起点与该起点对比,比对成功后起点后移一位,子串的起点同样后移一位继续比较,直到将子串与主串中全部匹配;若是中途出现比对失败的情况,则将主串从原起点的下一位开始继续这种比较。下面就根据BF算法使用while循环和for循环来分别实现字符串的匹配问题。

一、使用while循环实现BF

BF匹配算法的逻辑已经清楚了,剩下的就是将他转化为代码,其实使用while循环比使用for循环还是更符合BF算法的思想,也更好理解一些。但是使用while循环时处理匹配次数却不像for循环那样方便控制,这点for循环的实现还是优于while循环的。下面是while循环来实现BF匹配算法的代码:代码的阐述就是BF的逻辑细想没什么区别,熟悉下细想很容易就可以看懂了。
代码如下:

//Brute-Force匹配算法,该算法性能比较低----使用while实现public static void indexFirst(String strMain,String strSub){if(strMain.isEmpty() || strSub.isEmpty() || strSub.length()>strMain.length() ){System.out.println(-1);return;}char[] mainChars = strMain.toCharArray();char[] subChars = strSub.toCharArray();int i =0,j=0;while(i<mainChars.length && j<subChars.length){//匹配成功,继续匹配下一位if(mainChars[i]==subChars[j]){if(j==subChars.length-1){System.out.println(i-j);return;}i++;j++;}else{//匹配不成功,从下一位从新开始匹配i=i-j+1;j=0;}}System.out.println(-1);}

二、使用for循环实现BF

使用for循环实现BF匹配算法时,我们可以控制最外层的匹配次数。即代码中的i<mainChars.length-subChars.length+1,为什么i的取值可以是这个呢?因为若是i大于该值时主串剩余部分长度已经小于子串长度,此时主串已经不可能包含子串了,这样就可以退出循环了。在使用for循环实现的场景中,使用了三种退出循环的语句:continue、break、return。简单的总结下这三种退出循环的用法,如下:
continue:只结束当前这一次循环,开始下一次循环。
break:结束当前循环体,若是双层或者多层循环,只结束break所在的循环体的循环,其他循环不受影响。双层for循环中内层for循环使用break,相当于单层for循环中使用continue。这句话优点绕,绕不过来就看前面一句就好,这一句不用理会。
return:使用return会退出所有的for循环,无论多少层嵌套,整个方法到此就结束了。
代码如下:

    //Brute-Force匹配算法,该算法性能比较低----使用for循环实现/*** * @param strMain* @param strSub*/public static void indexFirstFor(String strMain,String strSub){if(strMain.isEmpty() || strSub.isEmpty() || strSub.length()>strMain.length() ){System.out.println(-1);return;}char[] mainChars = strMain.toCharArray();char[] subChars = strSub.toCharArray();for(int i=0;i<mainChars.length-subChars.length+1;i++){for(int j=0;j<subChars.length;j++){if(mainChars[i]==subChars[j]){if(j==subChars.length-1){System.out.println(i-j);return;}i++;continue;}else{break;}}}System.out.println(-1);}

三、测试两种实现是否正确

上面两种BF的实现代码已经完成了,下面就来测试下是否可用吧,笔者已经做了足够做的测试,在这里就只使用一种来展示下结果如下:

从上面的输出可以看到这种算法的实现没有问题。

四、总结

BF匹配算法,并不是一种高效的匹配算法,学习这种匹配算法,只是学习个反面教材,在真正的使用中,我们不应该去直接使用该算法去解决匹配场景的问题,相对更优秀的KMP算法才是我们应该考虑的。

Brute-Force模式匹配算法相关推荐

  1. 【数据结构】字符串 模式匹配算法的理解与实现 Brute Force算法(BF算法)与KMP算法 (C与C++分别实现)

    #笔记整理 若不了解串的定义,可至: 串(string)的定义与表示 查看 串的模式匹配算法 求子串位置的定位函数 Index(S, P, pos) 求子串的定位操作通常称作串的模式匹配(其中子串P称 ...

  2. Go 语言实现字符串匹配算法 -- BF(Brute Force) 和 RK(Rabin Karp)

    今天介绍两种基础的字符串匹配算法,当然核心还是熟悉一下Go的语法,巩固一下基础知识 BF(Brute Force) RK(Rabin Karp) 源字符串:src, 目标字符串:dest: 确认des ...

  3. Brute Force算法介绍及C++实现

    字符串的模式匹配操作可以通过Brute Force算法来实现.字符串匹配操作即是查看S串(目标串或主串)中是否含有T串(模式串或子串),如果在主串中查找到了子串,则模式匹配成功,返回模式串中的第一个字 ...

  4. DVWA学习(三)Brute Force(暴力破解)

    BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相 ...

  5. 串--串的定义,顺序、链式存储结构,BF、KMP模式匹配算法(C语言描述)

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.串(String)的定义: 串(String):由零个或多个字符组成的 ...

  6. BF算法(暴力算法)--模式匹配算法

    模式匹配算法:是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配.用途:搜索引擎.拼写检查.语言翻译.数据压缩等. BF算法:         ...

  7. 网络安全入门之 Burp Suite 暴力破解 DVWA Brute Force Low

    文章目录 1. 背景 2. 准备工作 2.1. 靶场环境 2.2. 安装破解工具 3. 破解过程 3.1. 代理请求 3.2. 拦截请求 3.3. 填装弹药 3.4. 设置岗哨 3.5. 开始攻击 4 ...

  8. 字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)

    字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct {char str[MAXSIZE];int length; }seqstring; 朴素 ...

  9. java 模式匹配算法_用Java匹配模式

    java 模式匹配算法 如果您使用的是Java,那么您很有可能以前已经看过它的模式匹配. String#matches(String)方法在内部使用Pattern类型,该类型包含更复杂的功能: 通过编 ...

  10. 吴昊品游戏核心算法 Round 7 —— 熄灯游戏AI(有人性的Brute Force)(POJ 2811)

    暴力分为两种,一种属于毫无人性的暴力,一种属于有人性 的暴力.前面一种就不说了,对于后面一种情况,我们可以只对其中的部分问题进行枚举,而通过这些子问题而推导到整个的问题中.我称之为有人性的Brute ...

最新文章

  1. Android Scroller 使用详解
  2. 包含c语言的序列化字符,Android Serializable与Parcelable原理与区别
  3. Oracle NVL函数的用法
  4. Spring boot的@Value注解
  5. DWR第六篇之文件下载
  6. 转:ps aux指令詳解
  7. 【转】java 自动装箱与拆箱
  8. Java熔断框架有哪些_降级熔断框架 Hystrix 源码解析:滑动窗口统计
  9. 每天进步一点点《SVD用于压缩》
  10. java 不存在数据返回的值是什么_Java方法
  11. mysql+rsyslog,loganalyzer+mysql+rsyslog中央日志服务器对syslog的web管理
  12. CCF认证-2015-3-2 数字排序
  13. 基于Emgu cv的图像拼接(转)
  14. JNI中访问JList的代码
  15. 搭建一个vue项目完整步骤及详细讲解
  16. 大唐移动骨干集体出走 TD人才考验大唐
  17. Linux cppcheck使用
  18. c语言自动输入一位数字,c语言:要求输入一个四位整数,然后将各位数字按英文输出...
  19. Andersen Global在南非拓展业务
  20. Zbrush一些基本操作

热门文章

  1. qt开发资料下载网址
  2. 为什么说跳槽加薪低于30%,等于在“降薪”?
  3. 怎么在搜索计算机学报的论文,计算机学报方面论文题目 计算机学报论文标题如何定...
  4. inaflash什么意思中文_flash是什么意思中文翻译
  5. matlab 求信号频率响应,频率响应 - MATLAB Simulink - MathWorks 中国
  6. Windows下usb接口驱动技术(一)
  7. RabbitMQ 工作模式二
  8. Riot Game前高管:游戏玩家将成为Web3真正粉丝的15大原因
  9. 1374:铲雪车(snow)——欧拉回路
  10. 信息安全-安全专业名称|CVE|RCE|POC|VUL|0DAY