字符串匹配的KMP算法
举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”?1、字符串”BBC ABCDAB ABCDABCDABDE”的第一个字符与搜索词”ABCDABD”的第一个字符,进行比较。因为B与A不匹配,所以搜索词后移一位。2、因为B与A不匹配,搜索词再往后移。3、就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止。4、接着比较字符串和搜索词的下一个字符,还是相同。5、直到字符串有一个字符,与搜索词对应的字符不相同为止。6、这时,最自然的反应是,将搜索词整个后移一位,再从头逐个比较。这样做虽然可行,但是效率很差,因为你要把”搜索位置”移到已经比较过的位置,重比一遍。7、一个基本事实是,当空格与D不匹配时,你其实知道前面六个字符是”ABCDAB”。KMP算法的想法是,设法利用这个已知信息,不要把”搜索位置”移回已经比较过的位置,继续把它向后移,这样就提高了效率。8、借助最长公共前缀后缀长度数组,将模式串向左移动合适的位置。
#include <iostream> #include <string.h> #include <stdio.h> using namespace std ;int next[100] ;void getNext( char p[] ) {int len = strlen(p) ;next[0] = 0 ;int i = 0 , j = 0 ;for(j = 1 ; j < len ; j++) { // i 代表最长前缀后缀长度while( p[i] != p[j] && i > 0 ) // 当p[i] != p[j] 时,减小最长前缀后缀长度i = next[i-1] ;if(p[i] == p[j]) {i++ ; //最长公共前缀后缀长度+1next[j] = i ; //匹配失败时跳到该处 }elsenext[j] = 0 ;} } int main() {char p[100] ;cin >> p ;int lenp = strlen(p) ;getNext(p);char s[1000] ;getchar() ;gets(s) ;int lens = strlen(s) ;int j = 0 ;bool flag = false ;for(int i = 0 ; i < lens ; i++) {if(p[j] == s[i])j++ ;else if(j-1 >= 0)j = next[j-1] ;if(j == lenp) {flag = true ;j = i ;break ;}}cout <<"结束位置:"<< j+1 << endl ;if(flag)cout << "YES" << endl ;elsecout << "NO" << endl ;return 0 ; }
转载于:https://www.cnblogs.com/NYNU-ACM/p/4236873.html
字符串匹配的KMP算法相关推荐
- [算法系列之二十六]字符串匹配之KMP算法
一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利 ...
- 字符串匹配(KMP 算法 含代码)
主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知 ...
- php随机匹配算法,字符串匹配的KMP算法+PHP实现
1. 前言 看了阮一峰的字符串匹配的KMP算法,写得很好,推荐看看. 不过我想自己写个例子描述一下这个算法,顺便写个PHP实现,于是有了这篇博文. 2. 概述 [来自维基百科] 字符串搜索算法 字符串 ...
- 算法串匹配C++实现字符串匹配的KMP算法
新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,迎欢批评指正 之前看<算法导论>符字串匹配分部讲到KMP算法,被弄得云里雾里.天今看到阮一峰写了一篇博客<符字串匹配的KMP算法 ...
- Java 字符串匹配的KMP算法
package Four;import java.util.Scanner;/**** 字符型的kmp算法* @author bai* 描述:* 给你一个文本串,再给你一个模式串,* 文本串中有多少个 ...
- 三十五、字符串匹配问题--KMP算法
一.暴力匹配算法实现字符串匹配 如果用暴力匹配的思路,并假设现在 str1 匹配到 i 位置,子串 str2 匹配到 j 位置,则有: 如果当前字符匹配成功(即 str1[i] == str2[j]) ...
- 字符串匹配的KMP算法(转)
转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字符串匹配是计算 ...
- 字符串匹配之KMP算法详解
kmp算法又称"看毛片"算法,是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚. ...
- 字符串匹配问题 ----- KMP算法
题意: 任意给定一段字符串str("123abc123abc00abc") 再输入一个关键字key("abc") 要求返回str中包含key的所有子串的头下标 ...
- 【转载】字符串匹配的KMP算法
转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 其他参考:htt ...
最新文章
- 数据结构(十)栈的作用--大数的加法运算
- 【linux高级程序设计】(第十五章)UDP网络编程应用 2
- Windows 上连接本地 Linux虚拟机上的 mysql 数据库
- 于其炒股,不如......
- 【鸿蒙 HarmonyOS】UI 组件 ( 拖动条 Slider 组件 )
- Python 多进程、多线程启动
- CE6内核启动过程-新角度
- OpenStack环境下nova resize报ssh连接错误
- 实体安全主要指计算机及网络硬件设备,计算机安全中的实体安全主要是指什么?...
- 博客转移至 https://www.babac.cn/
- Silverlight中使用MIRIA进行触屏编程
- 一行代码实现底部导航栏TabLayout
- 单开双控_卧室或者楼梯灯怎么安装单联双控
- 【读书笔记】Java NIO (中文版) 读书笔记
- 磁盘被写保护解除方法
- shel ---条件、循环
- 终于解决“Git Windows客户端保存用户名与密码”的问题zhz
- GKFX捷凯金融外汇官网:gkfx-cn com 投资之父的15条投资法则
- TensorFlow2.0基础学习笔记
- 21日活动议程和场地乘车路线
热门文章
- 模拟海_浙江平湖“海水稻”丰收的背后,有这家来自上海企业的科技“秘方”...
- js遍历追加html子样式,前端基本功:JS(十一)动画封装(CSS样式获取、JSON遍历)...
- matlab光强值,光强分布MATLAB.doc
- 装箱算法 java_贪心算法装箱问题-Java代码
- Android固定宽度文字自适应大小
- Android Apt失效:找不到Apt生成的对应类
- linux转换C编码风格
- 微软面试题:鸡蛋从第N层及以上的楼层落下会摔破
- 梯度下降法——得到的结果可能是局部最优值,如果凸函数则可保证梯度下降得到的是全局最优值...
- 格伦布编码——rice编码无非是golomb编码M为2^x的特例