字符串模式匹配
来源:互联网 发布:sem和seo是什么意思 编辑:程序博客网 时间:2024/04/28 12:56
一、简单的匹配算法
将主串S中某个位置i起始的子串和模式串T相比较。即从 j=0 起比较S[i+j] 与 T[j],若相等,则在主串 S 中存在以 i 为起始位置匹配成功的可能性,继续往后比较( j逐步增1 ),直至与T串中最后一个字符相等为止,否则改从S串的下一个字符起重新开始进行下一轮的"匹配",即将串T向后滑动一位,即 i 增1,而 j 退回至0,重新开始新一轮的匹配。
即某一次匹配失败,子串返回0,主串返回上次开始位置的下一个位置。
二、KMP算法
KMP算法的核心思想是利用已经得到的部分匹配信息来进行后面的匹配过程。
KMP算法“看毛片”算法,是一个效率非常高的字符串匹配算法。它的改进在于:每当一趟匹配过程中出现字符比较不相等时,不需回溯主串指针,而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。复杂度是O(n+m)。
三、求串的模式值next[]
next数组的求解方法是:第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。
例子:
模式串abaabcac next值01122312
1.前两位必定为0和1。
2.计算第三位的时候,看第二位b的next值,为1,则把b和1对应的a进行比较,不同,则第三位a的next的值为1,因为一直比
到最前一位,都没有发生比较相同的现象。
3.计算第四位的时候,看第三位a的next值,为1,则把a和1对应的a进行比较,相同,则第四位a的next的值为第三位a的next值
加上1。为2。因为是在第三位实现了其next值对应的值与第三位的值相同。
4.计算第五位的时候,看第四位a的next值,为2,则把a和2对应的b进行比较,不同,则再将b对应的next值1对应的a与第四位
的a进行比较,相同,则第五位的next值为第二位b的next值加上1,为2。因为是在第二位实现了其next值对应的值与第四位的
值相同。
5.计算第六位的时候,看第五位b的next值,为2,则把b和2对应的b进行比较,相同,则第六位c的next值为第五位b的next值加
上1,为3,因为是在第五位实现了其next值对应的值与第五位相同。
6.计算第七位的时候,看第六位c的next值,为3,则把c和3对应的a进行比较,不同,则再把第3位a的next值1对应的a与第六位
c比较,仍然不同,则第七位的next值为1。
7.计算第八位的时候,看第七位a的next值,为1,则把a和1对应的a进行比较,相同,则第八位c的next值为第七位a的next值加
上1,为2,因为是在第七位和实现了其next值对应的值与第七位相同。
next数组的求解方法是:
第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。
0 0
- 字符串模式匹配
- 字符串模式匹配
- 字符串模式匹配
- 字符串模式匹配算法
- 字符串模式匹配算法
- sql字符串模式匹配
- 字符串模式匹配算法
- 字符串的模式匹配
- 字符串的模式匹配
- 字符串模式匹配
- 多模式字符串匹配
- 字符串模式匹配
- 字符串模式匹配
- 字符串模式匹配
- KMP模式匹配字符串
- 字符串模式匹配
- 字符串模式匹配
- 字符串模式匹配
- 腾讯云数据库团队:PostgreSQL TOAST技术理解
- 手掌静脉识别——利用深度学习进行ROI的选取
- VS+VSS源代码管理_编辑时不自动签出
- Git commit message和工作流规范
- linux CentOS 7.2 服务器配置apache+mysql+php环境 (linux 系统下LAMP部署)
- 字符串模式匹配
- Java多线程中interrupt interrupted isInterrupted
- Bungee Jumping 物理题 能量关系
- bzoj 3229: [Sdoi2008]石子合并 (GarsiaWachs算法)
- 趣谈unicode,ansi,utf-8,unicode big endian这些编码有什么区别
- 简单学生类的继承
- Linux编程之UDP SOCKET全攻略
- 痛定思痛,奋勇前行
- Node.js 模块