举例来说,有一个字符串”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算法相关推荐

  1. [算法系列之二十六]字符串匹配之KMP算法

    一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利 ...

  2. 字符串匹配(KMP 算法 含代码)

    主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知 ...

  3. php随机匹配算法,字符串匹配的KMP算法+PHP实现

    1. 前言 看了阮一峰的字符串匹配的KMP算法,写得很好,推荐看看. 不过我想自己写个例子描述一下这个算法,顺便写个PHP实现,于是有了这篇博文. 2. 概述 [来自维基百科] 字符串搜索算法 字符串 ...

  4. 算法串匹配C++实现字符串匹配的KMP算法

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,迎欢批评指正 之前看<算法导论>符字串匹配分部讲到KMP算法,被弄得云里雾里.天今看到阮一峰写了一篇博客<符字串匹配的KMP算法 ...

  5. Java 字符串匹配的KMP算法

    package Four;import java.util.Scanner;/**** 字符型的kmp算法* @author bai* 描述:* 给你一个文本串,再给你一个模式串,* 文本串中有多少个 ...

  6. 三十五、字符串匹配问题--KMP算法

    一.暴力匹配算法实现字符串匹配 如果用暴力匹配的思路,并假设现在 str1 匹配到 i 位置,子串 str2 匹配到 j 位置,则有: 如果当前字符匹配成功(即 str1[i] == str2[j]) ...

  7. 字符串匹配的KMP算法(转)

    转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字符串匹配是计算 ...

  8. 字符串匹配之KMP算法详解

    kmp算法又称"看毛片"算法,是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚. ...

  9. 字符串匹配问题 ----- KMP算法

    题意: 任意给定一段字符串str("123abc123abc00abc") 再输入一个关键字key("abc") 要求返回str中包含key的所有子串的头下标 ...

  10. 【转载】字符串匹配的KMP算法

    转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 其他参考:htt ...

最新文章

  1. 数据结构(十)栈的作用--大数的加法运算
  2. 【linux高级程序设计】(第十五章)UDP网络编程应用 2
  3. Windows 上连接本地 Linux虚拟机上的 mysql 数据库
  4. 于其炒股,不如......
  5. 【鸿蒙 HarmonyOS】UI 组件 ( 拖动条 Slider 组件 )
  6. Python 多进程、多线程启动
  7. CE6内核启动过程-新角度
  8. OpenStack环境下nova resize报ssh连接错误
  9. 实体安全主要指计算机及网络硬件设备,计算机安全中的实体安全主要是指什么?...
  10. 博客转移至 https://www.babac.cn/
  11. Silverlight中使用MIRIA进行触屏编程
  12. 一行代码实现底部导航栏TabLayout
  13. 单开双控_卧室或者楼梯灯怎么安装单联双控
  14. 【读书笔记】Java NIO (中文版) 读书笔记
  15. 磁盘被写保护解除方法
  16. shel ---条件、循环
  17. 终于解决“Git Windows客户端保存用户名与密码”的问题zhz
  18. GKFX捷凯金融外汇官网:gkfx-cn com 投资之父的15条投资法则
  19. TensorFlow2.0基础学习笔记
  20. 21日活动议程和场地乘车路线

热门文章

  1. 模拟海_浙江平湖“海水稻”丰收的背后,有这家来自上海企业的科技“秘方”...
  2. js遍历追加html子样式,前端基本功:JS(十一)动画封装(CSS样式获取、JSON遍历)...
  3. matlab光强值,光强分布MATLAB.doc
  4. 装箱算法 java_贪心算法装箱问题-Java代码
  5. Android固定宽度文字自适应大小
  6. Android Apt失效:找不到Apt生成的对应类
  7. linux转换C编码风格
  8. 微软面试题:鸡蛋从第N层及以上的楼层落下会摔破
  9. 梯度下降法——得到的结果可能是局部最优值,如果凸函数则可保证梯度下降得到的是全局最优值...
  10. 格伦布编码——rice编码无非是golomb编码M为2^x的特例