【数据结构与算法】字符串匹配 - RK算法

数据结构与算法之字符串匹配算法 字符串匹配算法是在一个文本串中寻找一个模式串出现的算法。其基本原理是在文本串中逐个比较模式串的字符,如果匹配则继续比较下一个字符,如果不匹配则将模式串向右移动一位,继续比较。以下是一些常用的字符串匹配算法:暴力匹配法(Brute Force):从文本串的第一个字符开始,逐个比较模式串和文本串中的字符,如果不匹配则将模式串向右移动一位,继续比较。KMP算法(Knuth-Morris-Pratt):利用模式串本身的特点,在匹配失败时不回溯文本串,而是回溯模式串,让其尽量多地向右移动一位,以提高匹配效率。 阅读详情

【数据结构与算法】字符串匹配 - RK算法

RK(Rabin-Karp)算法是由Rabin和Karp两个大佬发明,RK算法的产生是因为发明者觉得BF算法那样每个字符一一比较太慢了,他们引入了哈希算法,哈希算法对主串中N - M + 1个字符串分别求哈希值,然后逐个与模式串的哈希值进行比较。

与暴力算法使用一致的思想,通过滑动窗口(每次滑动一位)的方式计算N - M + 1个子串的哈希值,依然以主串=AABABCDEF,模式串=ABCD为例,N = 9, M = 4 ,那么N - M + 1 = 6个字串,这6个字串分别是:
在这里插入图片描述
有了上面这些字串的哈希值,之后就可以与模式串的哈希值hash(ABCD)进行比较,如果哈希值相等,那么说明字符串可能匹配了。

通过上面的分析,我们就能得到一个大概的代码,如下:

public class Solution {
   
   
    /**
     * RK算法
     *
     * @param text    文本串
     * @param pattern 模式串
     * @return
     */
    private static int rk(String text, String pattern) {
   
   
        // 文本串长度
        int N = text.length();
        // 模式串长度
        int M = pattern.length();
        if (M > N) {
   
   
            return -1;
        }
        // 模式串的hash值
        int patternHash = hash(pattern);
        for (int i = 0; i < N - M + 1; i++) {
   
   
            // 获取与模式串等长的子串
            String subText = text.substring(i, i + M);
            // 获取子串的哈希值
            int subTextHash = hash(subText);
            if (subTextHash == patternHash) {
   
   
                // 返回匹配的开始索引
                return i;
            }
        }
        return -1;
    }

    private static int hash(String text) {
   
   
        // TODO获取字符串的哈希值
        return 0;
    }
}

在上面的代码中,通过循环加上截取字符串的方式肯定能获取到文本串中所有跟模式串长度一样的字串,然后通过hash算法,计算哈希值,与模式串的哈希值比较。

hash值如何实现呢?
比如模式串是ABCD,它的哈希值如何算呢?我们可以将每个字符的Unicode编码值相加就是hash(“ABCD”)的值。
A的Unicode编码值是65
B的Unicode编码值是66
C的Unicode编码值是67
D的Unicode编码值是68

所有ABCD的哈希值就是65 + 66 + 67 + 68 = 266 。
所有hash方法的实现如下:

private static int hash(String text) {
   
   
    int hashcode = 0;
    for (
字符串匹配之RK算法 Rabin-Karp字符串匹配算法,   实际应用中,Rabin和Karp建议的字符串匹配算法能较好地运行,还可以归纳出有关问题地其他算法,如二维模式匹配。   假定字符集Σ ={0, 1, 2, ……, 9}, 每一个字符对应一个十进制数字 (一般情况, 假定每个字符是基数为d的表示法中的一个数字, d=|Σ|。)可以用一个长度为k的十进制数字来表示由k个连续字符组成的字符串. 因此 阅读详情

相关推荐

STM32F429移植LVGL9.3.0:从源码配置到双缓冲优化实战

本文详细介绍了如何在STM32F429平台上移植LVGL 9.3.0图形库,涵盖从源码准备、工程配置、显示驱动适配到双缓冲优化等关键步骤。重点解析了利用STM32F429的硬件特性实现高效内存管理和流畅显示性能的实战技巧,为嵌入式GUI开发提供完整解决方案。

q6r7s8t9的博客 1128

[LaTeX] 调整参考文献的格式(References),包括作者名缩写,行距,字体,引用顺序等等

在此记录我对LaTeX中参考文献references的尝试,主要涵盖如题几个方面。

the Blog of 等不到天亮丶等时光 4万+

allegro 约束管理Constraint Manager(一)

介绍Cadence allegro 约束管理器CM的使用方法。

weixin_38975819的博客 8713

R语言生存分析之竞争风险模型

R语言生存分析之竞争风险模型 竞争风险模型(Competing Risk Model)是一种处理多种潜在结局生存数据的分析方法,早在1999年Fine和Gray就提出了部分分布的半参数比例风险模型,通常使用的终点指标是累积发生率函数(cumulative incidence function,CIF)。 研究中结局事件可能有多个,某些结局将阻止感兴趣事件的出现或影响其发生的概率,各结局事件形成“竞争”关系,互为竞争风险事件。 竞争风险模型( Competing Risk Model ) : 指

data+scenario+science+insight 5247

卫星轨道坐标转换:轨道六根数到经纬高(经STK验证)

a:半长轴(km)e:偏心率i:轨道倾角(度)Ω:升交点赤经(度)ω:近地点幅角(度)ν:真近点角(度)

weixin_52370774的博客 170

基于FPGA的万兆以太网学习(1)

万兆(10G) 以太网测速视频:SFP+屏蔽笼可以插入千兆或万兆光模块。SFP+信号定义与 SFP 一致。

baidu_34971492的博客 2249

影像技术实战02:FFmpeg 镜头切分误检、漏检问题排查与基于场景变化的稳定分镜方案

本文介绍了基于FFmpeg的镜头切分技术在实际应用中的常见问题及解决方案。文章首先指出单纯使用select='gt(scene,0.4)'命令进行镜头检测存在误检、漏检等问题,包括黑场、字幕变化被误判为镜头切换,以及相似场景切换被漏检等情况。随后提出了一套四层架构的稳定解决方案:1)用FFmpeg提取候选镜头变化点;2)解析变化点时间和分数;3)通过后处理过滤异常点;4)按时间点切割视频片段并生成报告。文中详细展示了Python实现代码,包括场景点检测、时间间隔过滤等功能模块,为视频剪辑、影视解说等场景提供

ai技术增长的博客 400

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: 【数据结构与算法】字符串匹配 - 暴力算法
下一篇: Java日志框架体系
「已注销」
博客等级 码龄3年 128粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值