串的子串(模式串)匹配算法
一、串的模式匹配算法
1、算法目的:
确定主串中所含子串(模式串)第一次出现的位置(定位)。
2、算法应用:
搜索引擎、拼写检查、语言翻译、数据压缩
3、算法种类:
●BF算法(Brute-Force, 又称古典的、经典的、朴素的、穷举的)
●KMP算法(特点:速度快)
二、BF算法(重点掌握)
1、Brute-Froce简称为BF算法,亦称简单匹配算法。采用穷举法的思路。如下图所示:
算法的思路是从S的每一个字符开始依次与T的字符进行匹配。
2、算法描述
int Index BF(SString S, SString T, int pos){int i=pos, j=1; //pos表示可以从任何一个字符开始,不一定为第一个字符while (i<=S.length && j<=T.length) { //只要i到了串尾或者j到了串尾就不用循环了,要不然就一直循环if (s.ch[i]==t.ch[j]) {++i; ++j; } //主串和子串依次匹配下一个字符
else {i=i-j+2;j=1;} //主串、 子串指针回溯重新开始下一次匹配
}if (j>=T.length)
return i-T.length; //返回匹配的第一个字符的下标
else return 0; //模式匹配不成功
}
算法的进一步解释:
①将主串的第pos个字符和模式串的第一个字符比较,
●若相等,继续逐个比较后续字符;
●若不等,从主串的下一字符起, 重新与模式串的第一个字符比较。
②直到主串的一个连续子串字符序列与模式串相等。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。
③否则,匹配失败,返回值0。
三、KMP算法(难点)
1、KMP算法较BF算法有较大改进,从而使算法效率有了某种程度的提高。
2、算法的设计思想:利用已经部分匹配的结果而加快模式串的滑动速度,且主串S的指针不必回溯。
3、为此,定义next[j]函数, 表明当模式中第j个字符与主串中相应字符"失配”时,在模式中需重新和主串中该字符进行比较的字符的位置。如下图所示为next[j]函数。
注:next[j]函数中的j和k都是相对于字串(模式串)而言的,与主串无关。即上图中的第一种情况表示字串(模式串)的前k-1个元素等于最后一个元素的前k-1个元素的话并且此时的k最大(因为k可能有多个取值),则next[j]就等于k。j表示字串(模式串)有j个字符。
4、算法描述
int Index KMР(SString S,SString T, int pos) {
i=pos,j =1;
while (i<S.length && j<T.length){if (j==0||S.ch[i]==T.ch[j]){i++;j++;}
else
j=next[j]; /*i不变j后退*/
}
if (j>T.length) return i-T.length; /*匹配成功*/
else return 0; /*返回不匹配标志*/
}void get_next(SString T,int &next[]){ //next[j]函数声明
i=1;next[1]=0;j=0;while(i<T.length){if(j==0||T.ch[i]==T.ch[j]){
++i; ++j;
next[i]=j;
else
j = next[j];}
}
串的子串(模式串)匹配算法相关推荐
- KMP算法求解next数组值(模式串从下标0开始或从下标1开始)以及求值后与主串的匹配过程
写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...
- 删除主串中模式串出现的字符
要求:输入一个主串X和模式串Y,要求删除主串X中在模式串Y中出现的所有字符.如:主串X:welcome to tencent. 模式串Y:aeio.则输出结果为:wlcm t tncnt. 思路:最直 ...
- 数据结构:详解KMP算法,手工求解next、nextval数组,求模式串的比较次数例题
KMP 算法 手工求解 next 数组,nextval数组 例题:求模式串的比较次数 2019 年 408 统考真题 设主串 T="abaabaabcabaabc",模式串 S=& ...
- (王道408考研数据结构)第四章串-第二节:串的模式匹配算法(朴素和KMP)
串的匹配是一个非常重要的话题,我们在Word中经常使用的搜索功能所反映的就是串的匹配问题,相应的算法也是层出不穷,各有优缺点,本节主要涉及两种算法:朴素算法和KMP算法 在讲解之前,有几个术语需要掌握 ...
- 《数据结构》—— 串,KMP模式算法(转载)
本文内容转载自: KMP 算法(1):如何理解 KMP KMP 算法(2):其细微之处 一:背景展开目录 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即 ...
- HDU 4787 在线AC自动机 分块(模式串和母串交叉给出,多次求getFail)
题意: 给定T个测试数据 n个操作 + 插入单词 ? 询问母串中有多少个子串 在上面出现过 ( 子串被加密,即←移动L位 (L为上次询问的答案) ) 分块思路: 因为模式串和母串交叉给出,正常来说应该 ...
- 【数据结构】顺序串的插入算法,删除算法,连接运算,顺序串求子串算法
主函数自行添加 头文件 + 宏定义 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 串的顺序存储 type ...
- P5357 【模板】AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数)
P5357 [模板]AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数) 传送门 形式上,AC 自动机基于由若干模式串构成的 Trie 树,并在此之上增加了一些 fail 边:本质 ...
- hdu2222(看一些单词哪些在模式串中出现过)
转载自:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 题意: t组测试数据,每组有n个单词和一个模式串,问n个单词有多少个在模 ...
最新文章
- c# 对文件流的读写
- OpenGL 三角形要点总结
- 利用Python随机或暴力生成密码
- JAVA做一个五星评论打分字体,java中的Font
- go post请求的响应数据渲染到html模板_干货你需要了解的六种渲染模式
- 中设置colorbar_气象绘图加强版(六)—Colorbar
- Sqlite3修复数据库
- php_js,举例说明JS调用PHP和PHP调用JS的方法_WEB前端开发
- android手机截图功能,手机截屏怎么弄?安卓手机怎么截屏?
- 企业网站建设需要从哪些方面入手
- 支付宝手机wap支付对接接口
- Qt之Cannot retrieve debugging output.
- 基于stm32c8t6的两轮平衡小车 第二篇——原理图及CubeMx配置
- MFC 消息映射 消息传递MESSAGE_MAP 读深入浅出MFC感悟
- mysql中esc是什么意思_esc按钮是什么意思
- 21天学通Java学习笔记-Day01
- ISO9001质量管理体系,9000认证管理体系
- 苹果CMSv10模板带后台和迅雷下载的侧栏样式
- 如何让excel表格排头一直都在_Excel表格技巧—凌乱的表格如何快速整理
- dSPACE学习笔记1
热门文章
- 数三退一问题||拉手成圈出圈问题
- 京东到家机器学习平台建设
- 我的世界服务器怎么无限刷红石,我的世界:生存最需要的5个红石机器!MC大神才能看懂这操作!...
- JavaScript(第三天)—爱创课堂专业前端培训
- idea从插件市场或者外部插件库导入插件的方式
- 动力锂离子电池电池检测标准和方法
- 快速弄懂iPhone X 设计尺寸和适配
- _SaveLog.dpr立即备份晓亮的电脑操作记录热键(快捷键) F11由于原来的 AutoIt 杀毒软件总是误报...
- 关于laravel中如何在where中使用in这回事
- 阿里云服务器遭到DDOS攻击怎么解决