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

相关文章

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

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Nginx中location实现多条件匹配的方法详解

《Nginx中location实现多条件匹配的方法详解》在Nginx中,location指令用于匹配请求的URI,虽然location本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑... 目录1. 概述2. 实现多条件匹配的方式2.1 使用多个 location 块2.2 使用正则表达式

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由