java字符串模式匹配next_字符串的模式匹配详解--BF算法与KMP算法

2023-11-16

一.BF算法    BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。

举例说明:

S: ababcababa

P: ababa

BF算法匹配的步骤如下

i=0 i=1 i=2 i=3 i=4

第一趟:ababcababa 第二趟:ababcababa 第三趟:ababcababa 第四趟:ababcababa 第五趟:ababcababa

ababa ababa ababa ababa ababa

j=0 j=1 j=2 j=3 j=4(i和j回溯)

i=1 i=2 i=3 i=4 i=3

第六趟:ababcababa 第七趟:ababcababa 第八趟:ababcababa 第九趟:ababcababa 第十趟:ababcababa

ababa ababa ababa ababa ababa

j=0 j=0 j=1 j=2(i和j回溯) j=0

i=4 i=5 i=6 i=7 i=8

第十一趟:ababcababa 第十二趟:ababcababa 第十三趟:ababcababa 第十四趟:ababcababa 第十五趟:ababcababa

ababa ababa ababa ababa ababa

j=0 j=0 j=1 j=2 j=3

i=9

第十六趟:ababcababa

ababa

j=4(匹配成功)

代码实现:

int BFMatch(char *s,char *p)

{

int i,j;

i=0;

while(i

{

j=0;

while(s[i]==p[j]&&j

{

i++;

j++;

}

if(j==strlen(p))

return i-strlen(p);

i=i-j+1; //指针i回溯

}

return -1;

}

其实在上面的匹配过程中,有很多比较是多余的。在第五趟匹配失败的时候,在第六趟,i可以保持不变,j值为2。因为在前面匹配的过程中,对于串S,已知s0s1s2s3=p0p1p2p3,又因为p0!=p1!,所以第六趟的匹配是多余的。又由于p0==p2,p1==p3,所以第七趟和第八趟的匹配也是多余的。在KMP算法中就省略了这些多余的匹配。

二.KMP算法

KMP算法之所以叫做KMP算法是因为这个算法是由三个人共同提出来的,就取三个人名字的首字母作为该算法的名字。其实KMP算法与BF算法的区别就在于KMP算法巧妙的消除了指针i的回溯问题,只需确定下次匹配j的位置即可,使得问题的复杂度由O(mn)下降到O(m+n)。

在KMP算法中,为了确定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表示P[0...j-1]中最长后缀的长度等于相同字符序列的前缀。

对于next[]数组的定义如下:

1) next[j] = -1  j = 0

2) next[j] = max(k): 0

3) next[j] = 0  其他

如:

P      a    b   a    b   a

j      0    1   2    3   4

next    -1   0   0    1   2

即next[j]=k>0时,表示P[0...k-1]=P[j-k,j-1]

因此KMP算法的思想就是:在匹配过程称,若发生不匹配的情况,如果next[j]>=0,则目标串的指针i不变,将模式串的指针j移动到next[j]的位置继续进行匹配;若next[j]=-1,则将i右移1位,并将j置0,继续进行比较。

代码实现如下:

int KMPMatch(char *s,char *p)

{

int next[100];

int i,j;

i=0;

j=0;

getNext(p,next);

while(i

{

if(j==-1||s[i]==p[j])

{

i++;

j++;

}

else

{

j=next[j]; //消除了指针i的回溯

}

if(j==strlen(p))

return i-strlen(p);

}

return -1;

}

因此KMP算法的关键在于求算next[]数组的值,即求算模式串每个位置处的最长后缀与前缀相同的长度, 而求算next[]数组的值有两种思路,第一种思路是用递推的思想去求算,还有一种就是直接去求解。

1.按照递推的思想:

根据定义next[0]=-1,假设next[j]=k, 即P[0...k-1]==P[j-k,j-1]

1)若P[j]==P[k],则有P[0..k]==P[j-k,j],很显然,next[j+1]=next[j]+1=k+1;

2)若P[j]!=P[k],则可以把其看做模式匹配的问题,即匹配失败的时候,k值如何移动,显然k=next[k]。

因此可以这样去实现:

void getNext(char *p,int *next)

{

int j,k;

next[0]=-1;

j=0;

k=-1;

while(j

{

if(k==-1||p[j]==p[k]) //匹配的情况下,p[j]==p[k]

{

j++;

k++;

next[j]=k;

}

else //p[j]!=p[k]

k=next[k];

}

}

2.直接求解方法

void getNext(char *p,int *next)

{

int i,j,temp;

for(i=0;i

{

if(i==0)

{

next[i]=-1; //next[0]=-1

}

else if(i==1)

{

next[i]=0; //next[1]=0

}

else

{

temp=i-1;

for(j=temp;j>0;j--)

{

if(equals(p,i,j))

{

next[i]=j; //找到最大的k值

break;

}

}

if(j==0)

next[i]=0;

}

}

}

bool equals(char *p,int i,int j) //判断p[0...j-1]与p[i-j...i-1]是否相等

{

int k=0;

int s=i-j;

for(;k<=j-1&&s<=i-1;k++,s++)

{

if(p[k]!=p[s])

return false;

}

return true;

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java字符串模式匹配next_字符串的模式匹配详解--BF算法与KMP算法 的相关文章

  • matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过 真是遗憾啊 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了 深度优先搜索倒是没用过 这次单独的将两个算法实现出来 因为算法本身和图像没什么关系 所以更纯粹些 广
  • range函数参数较大大时占据大量内存

    20200806 引言 编写一个编写的时候 发现内存逐步占用越来越大 脚本的目的是利用循环生成大量的数值 然后利用生分成的数值来执行某个函数 大致上的函数伪码就是下面这个 def some compute x pass max value
  • 基于 Android NDK 的学习之旅-----数据传输一(基本数据类型和数组传输)(附源码)

    之前的一些文章都有涉及到上层和中间层的数据传输 简单来说 也就是参数和返回值的使用 因为中间层要做的最多的也就是数据传输与转换 下面来介绍下这方面的知识 数据传输可分为 基本数据类型传输 和 引用数据类型的传输 因为数组传输也比较特别 其实
  • 神经网络基础-GRU和LSTM

    在深度学习的路上 从头开始了解一下各项技术 本人是DL小白 连续记录我自己看的一些东西 大家可以互相交流 本文参考 本文参考吴恩达老师的Coursera深度学习课程 很棒的课 推荐 本文默认你已经大致了解深度学习的简单概念 如果需要更简单的
  • Thread UncaughtExceptionHandler

    做web开发的时候 一般都是在Controller统一捕捉异常 在业务逻辑里抛出自定义的异常 如果代码中使用了多线程 线程中出错 或者你在线程中抛出一个异常 在最外层Controller里是无法捕捉到线程中的异常的 Thread类中定义了一
  • 用 Python 基于 pyecharts 对微信好友(性别,地域)进行分析,并数据可视化

    代码我是在anaconda的jupyter notebook里编写运行的 需要安装的库 在cmd里安装 pip install wxpy pip nstall pyecharts wxpy 在 itchat 的基础上 通过大量接口优化提升了
  • 机器学习面试问题总结

    机器学习算法面试问题 美团AI算法 1 xgboost原理 怎么防过拟合 2 gbdt推导 3 boosting和bagging在不同情况下的选用 4 DBSCAN原理和算法伪代码 与kmeans OPTICS区别 5 LSTM原理 与GR
  • STM32开发——简介、开发环境(Keil5、CubeMX)、HAL库

    目录 1 简介 初识STM32 2 开发环境 2 1使用Keil5 2 2使用STM32CubeMX 3 标准库与HAL库区别 4 推挽输出与开漏输出 1 简介 初识STM32 什么是单片机 单片机 Single Chip Microcom
  • STM32CubeMX 生成工程步骤图文说明

    本文也适合STM32CubeMX 支持的所有芯片的设置 调整文章结构 添加图文说明 2022 2 增加其他应用章节 增加 ADC 设置说明 2023 3 考虑到增加的内容越来越多 修改文章标题 增加PWM设置说明 2023 4 增加 DAC
  • 2023年美国大学生数学建模MCM问题Y:了解二手帆船的价格-解题思路及代码分享

    2023 MCM Problem Y Understanding Used Sailboat Prices 2023年MCM问题Y 了解二手帆船的价格 和许多奢侈品一样 帆船的价值会随着老化和市场条件的变化而变化 附件中所附的 2023 M
  • 变分贝叶斯variable bayes 和EM算法关系

    https blog csdn net weixin 30851409 article details 98905998
  • angular调用应用浏览器(如微信)内置api

    由于浏览器内置api的对象是在具体应用浏览器运行时注册生成的 因此如果不在代码中处理会过不了编译 对于angular 可以采取添加 ts ignore 来忽略 innerApi为非声明的对象 ts ignore innerAPI openW
  • 时序预测

    时序预测 MATLAB实现SO ELM蛇群算法优化极限学习机时间序列预测 目录 时序预测 MATLAB实现SO ELM蛇群算法优化极限学习机时间序列预测 效果一览 基本介绍 程序设计 学习总结 参考资料 效果一览 基本介绍 Matlab实现
  • C++中的友元函数

    什么是友元函数 友元函数 与成员函数相对 是定义在类外部 可以访问该类中的所有私有 private 成员和保护 protected 成员 指定函数为某个类的友元函数的方法是使用关键字friend friend lt 返回类型 gt lt 函
  • 华为od机试题1 真题

    华为od机试题 真题 86 射击比赛成绩排序 85 计算屏幕字母数量 84 组成最大数字 82 输出字符串中最小数字 81 数字4的个数 80 整数排列 79 多条件排列 78 时间排序 以下题目附带Java解法 是我个人写的 不一定是标准
  • vue新ref语法糖争议

    近日 Vue 发明人尤雨溪在 Vue RFCs 下提交了一份新的 Ref 语法糖提案 该提案一经发布便引来了不少争议 提案内容 这份提案就是在单文件组织 SFC 中引入一个新的script 标签写法 写法为 关于为什么这样做 尤雨溪表示 一
  • 基于EEGLAB的ICA分析

    目录 1 ICA原理 2 ICA的实现 3 ICA成分识别 4 ICLabel识别并去除伪迹 5 ICA成分识别练习 1 ICA原理 得到的每一个地形图 实际上就是它的权重谱 投射 根据原成分恢复原始信号 选择性投射 去伪 2 ICA的实现
  • java Comparator 多个字段比较

    List 中元素需要排序时 需要比较元素值 当元素是复杂对象时 有时需要根据多个字段进行排序 package com example demo domain import lombok Getter import lombok NoArgs
  • 八十九.计数排序、基数排序(查找与排序(四))——JAVA

    查找与排序 一 查找与排序 二 查找与排序 三 计数排序 一句话 用辅助数组对数组中出现的数字计数 元素转下标 下标转元素 步骤 1 找出原数组中元素值最大的 记为max 2 创建一个新数组helper其长度是max加1 其元素默认值都为0

随机推荐

  • Linux bluez蓝牙开发的准备工作

    最近为了搞这个蓝牙的事情 忙碌了好几天 我就是想结合 bluez 的代码随便玩一下蓝牙设备 而且能够参考源码写点测试程序来操作这个蓝牙设备 这里只是说明 Linux 下的准备工作而非嵌入式的arm 1 系统支持 我用的是真机安装的 Debi
  • springboot:整合rabbitmq之重试机制

    当我们消息消费失败的时候 可以进行重试 什么情况下会重发消息 1 网络抖动 2 程序抛出异常没有try catch RabbitMQ自动补偿机制触发 多用于调用第三方接口 1 当我们的消费者在处理我们的消息的时候 程序抛出异常情况下 默认无
  • FFmpeg测试视频的实时码流(音视频学习笔记五)

    前言 这篇博文记录一个简单的实时码流测试程序 事实上FFmpeg打开媒体文件后就可以获得整个视频的平均码流 只计算视频码流 但是无法获取实时码流 因为后面的工作需要对编解码做一些优化 需要实时观测码流 这里先实现一个比较简单的版本 运行结果
  • 简单的控制台学生信息系统

    package studentsystem import java util ArrayList import java util Scanner public class APP ArrayList
  • 华为OD机试 - 英文输入法 - 逻辑分析(Java 2023 B卷 100分)

    目录 专栏导读 一 题目描述 1 需求如下 2 注意 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 4 区分大小写 如果联想不到 输出前缀 华为OD机试 2023B卷题库疯狂收录
  • tms xdata开发连接sqlite数据库的rest server

    1 使用向导 2 设置fdconnection的连接属性 3 设置授权 否则服务无法运行 4 运行tms data modeler 工具 5 将刚刚生成的unipersons pas文件加入到工程中 6 结果
  • 互联网摸鱼日报(2023-07-20)

    互联网摸鱼日报 2023 07 20 InfoQ 热门话题 龙蜥操作系统重磅更新 全面支持智能计算 兼容主流AI框架 微软赢麻了 联合Meta 重磅发布开源 可直接商用大模型Llama 2 网友 OpenAI 感觉如何 ChatGPT 提效
  • 【redis事务】@Transactional对Redis事务起作用(包含redis+lua)

    redis事务 Transactional对Redis事务起作用 包含redis lua 一 前言 二 准备 三 StringRedisTemplate 开启事务 四 关键代码 验证 Transactional对redis事务是否生效 五
  • java帧结构_详细解析Java虚拟机的栈帧结构

    什么是栈帧 正如大家所了解的 Java虚拟机的内存区域被划分为程序计数器 虚拟机栈 本地方法栈 堆和方法区 什么 你还不知道 赶紧去看看 Java虚拟机内存结构及编码实战 这次要介绍的栈帧 Stack Frame 就是Java虚拟机中的虚拟
  • stm32F1的JTAG、SWJ作为普通引脚使用。禁用JTAG、SWJ。

    stm32F1的JTAG SWJ引脚 为 PA13 PA14 PA15 PB3 PB4 单片机复位后 默认功能为 JTAG SWJ 而实际使用中 一般只使用 SWCLK SWDIO这两个引脚做 Debug 其余的引脚可以空出来 重新定义为普
  • 红外避障小车(ZK-2)初步拼装

    红外避障小车 ZK 2 初步拼装 一 拼装零件 1 M330螺丝4个 2 M312铜柱4个 3 M8螺丝4个 M36螺丝8个 4 码盘2个 5 M3螺母8个 6 T型小支架4个 7 船型开关1个 8 轮胎2个 9 万向轮1个 10 电池盒1
  • [Java反序列化]AspectJWeaver反序列化

    Java反序列化 AspectJWeaver反序列化 前言 2021年二月份ysoserialize增加了这条AspectJWeaver链子 之后陆续在2021年的D3CTF以及国赛决赛中都出现了这条链子的攻击 所以学习一下AspectJW
  • 深入学习jquery源码之replaceWith()和replaceAll()

    深入学习jquery源码之replaceWith 和replaceAll replaceWith content fn 概述 将所有匹配的元素替换成指定的HTML或DOM元素 参数 content String Element jQuery
  • 网络推广引流方法大全

    在互联网的圈子里有关网络推行的问题是一个永久的话题 你的商品哪怕再好假如没有推行进来一切都是白搭 经常听有人说 酒香不怕巷子深 但分离当今社会的方式 特别是在竞争日益严酷的今天我想 酒香也会怕巷子深了 进入互联网时期 企业产品推行再也不能仅
  • Nosql 概念释义

    进几年常常听到一个高大上的名字 osql 再加上鼓吹者说Nosql将会消灭关系数据库 今天怀着好奇心里 简单了解了以下Nosql的概念 发现其实没有那么神秘 被鼓吹者夸大其词了 导致我等门外汉一下子给打懵了 我认为 一个新技术要想让大家使用
  • IDEA插件系列(9):MyBatisX插件——Mybatis插件

    MybatisX插件功能 mapper和xml可以来回跳转 mybatis xml 映射器 xml提示 mapper和xml支持自动提示 如jpa 参考MybatisCodeHelperPro 集成mybatis生成器Gui 从免费myba
  • 【译】A gentle introduction to self-sovereign identity

    2017年5月17日 ANTONYLEWIS2015 2017年5月 印度互联网和社会智库中心发布了一份报告 详细说明了印度国家身份数据库 Aadhaar 泄漏可能会泄露个人信息的方式 该信息涉及超过1 3亿印度国民 泄密事件为财务欺诈创造
  • 关于习而学的软件工程教育

    邹欣老师的博客在此 http www cnblogs com xinz archive 2012 01 08 2316717 html 我不是很同意邹欣老师的观点 对于一个大学生 思想远比实践经验要重要 子曾经曰过 世界上最简单的事情就是学
  • 再也不用手写爬虫了!推荐5款自动爬取数据的神器!

    大家好 我是菜鸟哥 今天给大家推荐一些不错的神器 网络信息的时代 想要收集信息 爬虫是一项必不可少的工具 对于很多小伙伴们来说 只是想利用爬虫进行快速的内容抓取 而并不想太过深入的学习爬虫 利用python编写爬虫程序虽然炫酷 但是需要耗费
  • java字符串模式匹配next_字符串的模式匹配详解--BF算法与KMP算法

    一 BF算法 BF算法是普通的模式匹配算法 BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配 若相等 则继续比较S的第二个字符和P的第二个字符 若不相等 则比较S的第二个字符和P的第一个字符 依次比较下去 直到得出最后