一、串的模式匹配算法

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];}
}

串的子串(模式串)匹配算法相关推荐

  1. KMP算法求解next数组值(模式串从下标0开始或从下标1开始)以及求值后与主串的匹配过程

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  2. 删除主串中模式串出现的字符

    要求:输入一个主串X和模式串Y,要求删除主串X中在模式串Y中出现的所有字符.如:主串X:welcome to tencent. 模式串Y:aeio.则输出结果为:wlcm t tncnt. 思路:最直 ...

  3. 数据结构:详解KMP算法,手工求解next、nextval数组,求模式串的比较次数例题

    KMP 算法 手工求解 next 数组,nextval数组 例题:求模式串的比较次数 2019 年 408 统考真题 设主串 T="abaabaabcabaabc",模式串 S=& ...

  4. (王道408考研数据结构)第四章串-第二节:串的模式匹配算法(朴素和KMP)

    串的匹配是一个非常重要的话题,我们在Word中经常使用的搜索功能所反映的就是串的匹配问题,相应的算法也是层出不穷,各有优缺点,本节主要涉及两种算法:朴素算法和KMP算法 在讲解之前,有几个术语需要掌握 ...

  5. 《数据结构》—— 串,KMP模式算法(转载)

    本文内容转载自: KMP 算法(1):如何理解 KMP KMP 算法(2):其细微之处 一:背景展开目录 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即 ...

  6. HDU 4787 在线AC自动机 分块(模式串和母串交叉给出,多次求getFail)

    题意: 给定T个测试数据 n个操作 + 插入单词 ? 询问母串中有多少个子串 在上面出现过 ( 子串被加密,即←移动L位 (L为上次询问的答案) ) 分块思路: 因为模式串和母串交叉给出,正常来说应该 ...

  7. 【数据结构】顺序串的插入算法,删除算法,连接运算,顺序串求子串算法

    主函数自行添加 头文件 + 宏定义 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 串的顺序存储 type ...

  8. P5357 【模板】AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数)

    P5357 [模板]AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数) 传送门 形式上,AC 自动机基于由若干模式串构成的 Trie 树,并在此之上增加了一些 fail 边:本质 ...

  9. hdu2222(看一些单词哪些在模式串中出现过)

    转载自:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 题意: t组测试数据,每组有n个单词和一个模式串,问n个单词有多少个在模 ...

最新文章

  1. c# 对文件流的读写
  2. OpenGL 三角形要点总结
  3. 利用Python随机或暴力生成密码
  4. JAVA做一个五星评论打分字体,java中的Font
  5. go post请求的响应数据渲染到html模板_干货你需要了解的六种渲染模式
  6. 中设置colorbar_气象绘图加强版(六)—Colorbar
  7. Sqlite3修复数据库
  8. php_js,举例说明JS调用PHP和PHP调用JS的方法_WEB前端开发
  9. android手机截图功能,手机截屏怎么弄?安卓手机怎么截屏?
  10. 企业网站建设需要从哪些方面入手
  11. 支付宝手机wap支付对接接口
  12. Qt之Cannot retrieve debugging output.
  13. 基于stm32c8t6的两轮平衡小车 第二篇——原理图及CubeMx配置
  14. MFC 消息映射 消息传递MESSAGE_MAP 读深入浅出MFC感悟
  15. mysql中esc是什么意思_esc按钮是什么意思
  16. 21天学通Java学习笔记-Day01
  17. ISO9001质量管理体系,9000认证管理体系
  18. 苹果CMSv10模板带后台和迅雷下载的侧栏样式
  19. 如何让excel表格排头一直都在_Excel表格技巧—凌乱的表格如何快速整理
  20. dSPACE学习笔记1

热门文章

  1. 数三退一问题||拉手成圈出圈问题
  2. 京东到家机器学习平台建设
  3. 我的世界服务器怎么无限刷红石,我的世界:生存最需要的5个红石机器!MC大神才能看懂这操作!...
  4. JavaScript(第三天)—爱创课堂专业前端培训
  5. idea从插件市场或者外部插件库导入插件的方式
  6. 动力锂离子电池电池检测标准和方法
  7. 快速弄懂iPhone X 设计尺寸和适配
  8. _SaveLog.dpr立即备份晓亮的电脑操作记录热键(快捷键) F11由于原来的 AutoIt 杀毒软件总是误报...
  9. 关于laravel中如何在where中使用in这回事
  10. 阿里云服务器遭到DDOS攻击怎么解决