模式串: 想要在主串中找到某个子串

串的模式匹配: 设有主串s和子串t, 子串t的定位就是在主串s中找到一个与子串t相等的子串

通常把主串s成为目标串, 把子串t成为模式串, 模式串在子串的定位称作模式匹配

模式匹配算法

简单模式匹配

假设s=“40815150” , t=“150” 进行简单模式匹配

最终结果: i = 6 ; j = 1

基本思路:
从目标字符串的第一个字符开始和模式串的第一个字符比较:
若相等, 则继续逐个比较后续的字符;
否则, 从目标串下一个字符开始重新与模式串t的第一个字符进行比较

箱单模式匹配代码

int Index(SString S, SString T){int k = 1;int i = k, j = 1;while(i<=S.length && j<T.length){if(S.ch[i]==T.ch[i]){++i;++j;//继续比较后续字符串}else{k++;//检查后续字符串i=k;j=1;}}if(j>T.length){return k;}else{return 0;}
}

算法的性能分析:
假设主串s的长度为n, 模式串的长度为m, 进行简单模式匹配
最好的情况下, 匹配成功, 时间复杂度为O(m)

最好的情况: 匹配失败, 时间复杂度为O(n-m+1)

最坏情况: 匹配成功, 比较(n-m+1)*m次, 时间复杂度为O(nm)

最坏情况: 匹配失败, 比较(n-m+1)*m次, 时间复杂度为O(mn)

KMP算法

假设S为’abaabaabaabaabc’, 模式串t为’abaabc’

简单模式算法匹配, 每次失配后都要一格一格往后移动, 所以指针i经常回溯

能不能让主串i不回溯, 只让j回溯

KMP算法思路
消除了主串指针的回溯, 从而使算法效率有了某种程度的提高
在每趟匹配的过程中, 当发生字符比较不相等时, 不回溯i指针, 而是利用已经得到的部分匹配结果, 将模式串向右滑动尽可能远的一段距离后, 继续进行比较

前缀: 指除最后一个字符以外, 字符串的所有头部子串

后缀: 指除第一个字符外, 字符串的所有尾部子串

公共前后缀: 前缀和后缀相等的部分

最大公共前后缀: 前缀和后缀的最长相等前后缀长度

部分匹配值: 最大公共前后缀的长度;

next数组值: 当前位置之前子串的部分匹配值+1, next[1]默认值为0

求模式串T的next数组

void get_next(SString T, int next[]){int i=1, j=0;next[1]=0;while(i<T.length){if(j==0||T.ch[i]==T.ch[j]){++i;++j;next[i]=j;   }else{j = next[j]; }}
}

KMP算法

int Index_KMP(SString S, SString T, int next[]){int i =1, j=1;while(i<S.length&& j<T,length){if(j==0||S.ch[i]==T.ch[j]){++i;++j;/继续比较后续字符}else{j=next[j];//模式串向右移动  }if(j>T,length){//匹配成功return i-T.length;}else{return 0;}}
}

改进的KMP算法

nextval数组的求法:
判断当前位置元素与next[i]比较:
若相同: 则nextval [i] = nextval [ next [i] ];
相当于nextval数组保存实际需要比较开始的位置
若不同,则nextval [ i ] = next [ i ]

改进的KMP算法的代码

void get_nextval(SString T, int next[]){for(int j=2; j<T.length; j++){if(T.ch[next[j]]==T.ch[j]){nextval[j] = nextval[next[j]];//跳到实际要开始比较的地方   }else{nextval[j] = next[i];    }}
}

时间复杂度是(M+N)

数据结构 - 串的模式匹配相关推荐

  1. 数据结构 串 KMP 模式匹配详解 通俗易懂

    KMP 模式匹配详解通俗易懂 KMP 模式匹配是解决字符串匹配的问题 一.原始的字符串暴力匹配 要点:子串的第一个字符匹配成功主串的字符后就依次匹配子串后面的字符,直到子串匹配结束 代码: publi ...

  2. [入门必看]数据结构4.2:串的模式匹配

    [入门必看]数据结构4.2:串的模式匹配 第四章 串 4.2 串的模式匹配 知识总览 4.2.1_朴素模式匹配算法 4.2.2_1_KMP算法 4.2.2_2_求next数组 4.2.3_KMP算法的 ...

  3. 数据结构之串:串的模式匹配

    串:串的模式匹配 模式匹配的定义: 实现代码: 模式匹配的定义: 实现代码: int Index(SString S,SString T,int pos){int i = pos,j = 1;whil ...

  4. 《数据结构》实验报告四:串的模式匹配(BF算法、KMP算法)

    一.实验目的 1.了解串的基本概念. 2.掌握串的模式匹配算法的实现 . 二.实验预习 说明以下概念 1.模式匹配: 串的模式匹配就是子串的定位运算. 设有两个字符串 S 和 T ,S为主串(正文串) ...

  5. 数据结构—串-基本知识点(第五章)

    目录 1. 串的定义 2. 串的比较 3. 串的抽象数据类型 4. 串的存储结构 4.1 串的顺序存储结构 4.2 串的链式存储结构 5. 朴素的模式匹配算法 6. KMP模式匹配算法 1. KMP模 ...

  6. Java数据结构-串及其应用-KMP模式匹配算法

    1.前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而且这个算法的不少 ...

  7. 数据结构---BF字符串模式匹配

    数据结构-BF字符串模式匹配 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> int BF(char * S, cha ...

  8. 串的模式匹配(KMP算法)

    [问题描述] 串的模式匹配算法实现(KMP算法) [输入形式] 第一行输入主串s: 第二行输入模式串t: 第三行输入起始位置pos: [输出形式] 输出模式串t的next值(以空格分隔) 输出模式匹配 ...

  9. python数据结构-串

    串 字符串也叫串,是由字符组成的有限序列,是一种常用的非数值数据 串的逻辑结构是线性表,其每个数据元素都是一个字符 串主要是对子串进行操作 通常采用顺序存储结构存储 为什么不用链式呢?字符串都是一段序 ...

最新文章

  1. flask项目中无法更改端口号
  2. python装饰器函数-Python精进-装饰器与函数对象
  3. c语言中 c2059错误是,解决error C2059: 语法错误:“::”问题
  4. vue的鼠标移入和移出
  5. JavaCL 1.0.0-RC3 发布,性能大幅提升
  6. ux和ui_他们说,以UX / UI设计师的身份加入一家初创公司。 他们说,这会很有趣。
  7. win2012 ad用户和计算机,Server2012R2搭建AD域服务器并添加登录用户
  8. 想进美团不知道选哪个技术岗位?这里有一份通关秘籍!
  9. 计算机系统注册表的由来,计算机系统注册表
  10. 能让程序员瞬间崩溃的五个瞬间,共鸣的同学请举手!
  11. 编译运行BSR/bench源码
  12. 少年,别再收藏文章了!
  13. SqlServer 2017 下载地址及密钥下载地址
  14. 火狐主页被360导航劫持怎么办
  15. 台达plc ec3程序下载通讯设置_【台达PLC】入门这样学!基础详解!
  16. 加点字符就能让qq昵称很酷的神奇代码?
  17. CAN总线简易入门教程
  18. 传感器是新技术革命和当前信息社会的重要技术
  19. 有没有一款桌面便签软件,可以手机电脑都能使用的?
  20. linux 批量替换文件cp,Linux下批量修改文件名

热门文章

  1. AIX 12.1.0.2 rtld: 0712-001 Symbol CreateIoCompletionPort was referenced from module
  2. 广州市番禺区委领导一行莅临和鲸科技考察交流
  3. win11卸载软件怎么恢复?5个方法总有一种适合你
  4. c++的内存取悦_取悦客户的5种方法以及您应该这样做的5个原因
  5. Android UI 设计规范,挥泪整理面经
  6. 迅为RK3568开发板Android12系统功能测试-开机启动
  7. Jpa数据操作以及@Query和@Modifying注解使用
  8. hdu 1408 盐水的故事
  9. 一般本科院校毕业论文要求
  10. CFI与物理层峰值速率的关系