字符精确匹配算法bf、kmp、bm、sunday、rk

2024-02-07 15:30

本文主要是介绍字符精确匹配算法bf、kmp、bm、sunday、rk,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

字符精确匹配算法bf、kmp、bm、sunday、rk

目录

  • 字符精确匹配算法bf、kmp、bm、sunday、rk
    • bf算法
        • 算法详解
        • 算法代码
    • kmp算法
        • 算法详解
        • 算法代码
    • bm算法
        • 算法详解
        • 算法代码
    • Sunday算法
        • 算法详解
        • 算法代码
    • rk算法
        • 算法详解
        • 算法代码

bf算法

算法详解

bf算法又称暴力匹配算法,暴力匹配的思路是:从头开始,一个一个的去匹配,每匹配成功一个字符,偏移量(模式串的下标)加1,直到超出文本串或模式串的范围或失配情况,超出文本串范围时说明文本串不存在模式串,超出模式串范围时说明匹配成功,失配情况则将偏移量置0,文本串的下标加1。看下图有助于理解:

在这里插入图片描述

算法代码
    /*** 暴力匹配算法*/public int violentSearch(String text, String pattern){int res = -1;if (text == null || pattern == null){return res;}char[] s = text.toCharArray();char[] p = pattern.toCharArray();// i=>s,,j=>p,j也可以看成是偏移量int i = 0, j = 0;while (true){if (i+j>=s.length || i<0){break;} else if (j>=p.length || j<0){res = i;break;} else if (s[i+j] == p[j]){j++;} else {i++;j = 0;}}return res;}

kmp算法

算法详解

kmp算法是在暴力匹配算法上做的一个优化,它是根据模式串的特征来生成一个next数组,在每次字符失配的时候,根据next数组中的值来跳转,而不是直接跳转到模式串的开头。
1、next函数详解
在很多地方都会通过字符串的前缀和后缀来推导next函数,我刚开始的时候也是一直琢磨着那些文章(比如阮一峰的kmp文章),可能因为我的思维跟他们不一样吧,所以理解很痛苦,所幸最后还是读懂了他们的思路。下面我以我的思路来详解一下next函数:next数组的前两位值永远是[-1,0],后续next值的将会根据前面的字符和next值来求,详解看图。
在这里插入图片描述
2、next函数详解----优化版
上述求解的next[j]的值是跟第j个字符没有任何关系的,所以好多大佬都会做个优化。这里以我的思路来讲,优化就是在用上述方式求出值后,判断当前字符是否和当前next值指向的字符相等,若相等则当前的next值变为当前next值指向的位置的next值,如图。当然,在实际写的时候稍微优化一下。

在这里插入图片描述

算法代码
    /*** kmp算法的next数组求解*/private int[] getNext(char[] str) {if (str == null) {return null;}switch (str.length) {case 0:return new int[]{};case 1:return new int[]{-1};case 2:return new int[]{-1,0};default:break;}int[] next = new int[str.length];next[0] = -1;next[1] = 0;// j是字符的序号,k是j-1字符的next值int j=2,k=0;while (j<str.length){if (k==0 || str[j-1] == str[k]){next[j] = (str[j-1] == str[k])?++k:0;j++;} else {k = next[k];}}return next;}/*** kmp算法的next数组求解--优化版*/private int[] getNextVal(char[] str) {if (str == null) {return null;}switch (str.length) {case 0:return new int[]{};case 1:return new int[]{-1};case 2:return new int[]{-1,0};default:break;}int[] next = new int[str.length];next[0] = -1;next[1] = 0;// j是字符的序号,k是j-1字符的next值int j=2,k=0;while (j<str.length){if (k==0 || str[j-1] == str[k]){next[j] = (str[j-1] == str[k])?++k:0;// 如果j和next[j]的字符相等,则把next[j]值替换为next[ next[j] ],否则保留原值,k将记录原值if (str[ next[j] ] == str[j]) {next[j] = next[ next[j] ];}j++;} else {k = next[k];}}return next;}/*** 字符串匹配的kmp算法*/public int kmpSearch(String text, String pattern) {int i=0,j=0;char[] s = text.toCharArray();char[] p = pattern.toCharArray

这篇关于字符精确匹配算法bf、kmp、bm、sunday、rk的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/688139

相关文章

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

详解nginx 中location和 proxy_pass的匹配规则

《详解nginx中location和proxy_pass的匹配规则》location是Nginx中用来匹配客户端请求URI的指令,决定如何处理特定路径的请求,它定义了请求的路由规则,后续的配置(如... 目录location 的作用语法示例:location /www.chinasem.cntestproxy

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st