字符精确匹配算法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

相关文章

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

Python使用Turtle实现精确计时工具

《Python使用Turtle实现精确计时工具》这篇文章主要为大家详细介绍了Python如何使用Turtle实现精确计时工具,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录功能特点使用方法程序架构设计代码详解窗口和画笔创建时间和状态显示更新计时器控制逻辑计时器重置功能事件

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

Nginx location匹配模式与规则详解

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

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

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