今天,看了KMP,首先是在网上看的,看了很久没看懂,有很多思想,很多next的推导,就相当于很多的版本,后来,去看了<<大话数据结构>>这本书,才看懂,这KMP的神奇之处,这本书写得很详细,非常好理解,对于KMP的思想,对于next的推导,next的优化,都说得比较好理解。看懂后,才惊觉,网上的很多人竟然是不懂KMP就敢写,很容易误导人,比如有的对于next的推导过程,根本就不是O(m),应该算是O(m*m)的,唉。。。看完next的推导,优化,不觉惊叹这牛逼的算法啊。其实我想说,想要看KMP,最好去看书,网上学真难。。。下面给出KMP的模板吧,也写了一点注释,要讲解KMP我也是没这么多时间,也很难讲通

对于字符串,有个 \0 结尾的特性。

KMP 测试题 http://www.cnblogs.com/haoabcd2010/p/6842448.html

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. using namespace std;
  5. #define MAXS 5000
  6. #define MAXT 500
  7.  
  8. char S[MAXS];
  9. char T[MAXT];
  10. int next[MAXT];
  11.  
  12. // 关键在于next数组的推导,next[i] 代表的意义是:如果朴素匹配失配,j 应该变为多少
  13. //在推导next时,使用了已经推导了的next数组,所以我感觉有dp的思想在里面
  14. void get_next(char * t,int l) //没优化但不易出错,其实不优化不会慢多少
  15. {
  16. int i=,j=-;
  17. next[]=-;
  18. while(i<l)
  19. {
  20. if (j==-||T[i]==T[j])
  21. next[++i]=++j;
  22. else
  23. j=next[j]; //回溯
  24. }
  25. }
  26.  
  27. /*
  28. //优化的next很有意思,将重复的状态叠在一起了
  29. void get_next(char * t,int l) //优化的,一定注意,要慎重使用
  30. {
  31. int i=0,j=-1;
  32. next[0]=-1;
  33. while (i<l)
  34. {
  35. if (j==-1||T[i]==T[j])
  36. {
  37. i++;j++;
  38. if (T[i]!=T[j]) next[i]=j;
  39. else next[i]=next[j];
  40. }
  41. else j = next[j];
  42. }
  43. }
  44. */
  45.  
  46. int KMP(char *s,char *t) //求匹配索引
  47. {
  48. int lens = strlen(s);
  49. int lent = strlen(t);
  50. get_next(t,lent);
  51. int i=-,j=-;
  52. while (i<lens&&j<lent)
  53. {
  54. if (j==-||S[i]==T[j])
  55. i++,j++;
  56. else
  57. j = next[j];
  58.  
  59. }
  60. if (j==lent)
  61. return i-lent;
  62. return -;
  63. }
  64.  
  65. int KMP_count(char *s,char *t) //求匹配数,一定要用没优化的
  66. {
  67. int res = ;
  68. int lens = strlen(s);
  69. int lent = strlen(t);
  70. get_next(t,lent);
  71. int i=-,j=-;
  72. while (i<lens)
  73. {
  74. if (j==-||S[i]==T[j])
  75. i++,j++;
  76. else
  77. j = next[j];
  78. if (j==lent)
  79. {
  80. res++;
  81. j = next[j];
  82. }
  83. }
  84. return res;
  85. }
  86.  
  87. int main()
  88. {
  89. scanf("%s",S);
  90. scanf("%s",T);
  91. int p = KMP(S,T);
  92. printf("%d\n",p);
  93. return ;
  94. }

关于KMP算法的感想的更多相关文章

  1. 自己对kmp算法的理解,借由 28. 实现 strStr() 为例

    做题思路 or 感想 : 就借由这道题来理解一下kmp算法吧 kmp算法的操作过程我觉得有句话很合适 :KMP 算法永不回退 目标字符串 的指针 i,不走回头路(不会重复扫描 目标字符串),而是借助 ...

  2. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  3. KMP算法

    KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串 ...

  4. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  5. KMP算法实现

    链接:http://blog.csdn.net/joylnwang/article/details/6778316 KMP算法是一种很经典的字符串匹配算法,链接中的讲解已经是很明确得了,自己按照其讲解 ...

  6. 数据结构与算法JavaScript (五) 串(经典KMP算法)

    KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配 ...

  7. 扩展KMP算法

    一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...

  8. 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

    之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...

  9. 算法:KMP算法

    算法:KMP排序 算法分析 KMP算法是一种快速的模式匹配算法.KMP是三位大师:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的,所以取首字母组成KMP. 少部分图片来自孤~影 ...

随机推荐

  1. 怎样允许其他电脑连接本机MySQL

    2017-04-20 1.***\bin\>MySQL -h localhost -u root -p  这样应该可以进入MySQL服务器  执行代码如下: MySQL>use mysql ...

  2. AcpectJ注释方式配置AOP

    1.AspectJ的概念   @AspectJ类似于Java注解的普通Java类   Spring可以使用AspectJ来做切入点解析   AOP的运行时仍旧是纯的Spring AOP,对Aspect ...

  3. TestNG+ReportNG+IDEA+Git+Jenkins+surefire持续集成数据驱动dubbo接口测试

    一.pom.xml增加testng相关配置 <!--添加插件 关联testNg.xml--><plugin> <groupId>org.apache.maven.p ...

  4. java学习笔记——Collection集合接口

    NO 方法名称 描述 1 public boolean add(E e) 向集合中保存数据 2 public void clear() 清空集合 3 public boolean contains(O ...

  5. 黑马程序猿——JAVA高新技术——反射

    ----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一.对于反射的概念 对于JAVA反射机制是在执行状态中,对于随意一个类.都可以知道 ...

  6. VB,Visual Basic如何修改代码文本大小和字体

    工具-选项-编辑器格式   修改之后效果如图所示

  7. 【MVC4】依頼注入

    ※本文参照<ASP.NET MVC 4高级编程>

  8. sone1动态树

    这尼吗桑心病狂的动态树:http://www.lydsy.com/JudgeOnline/problem.php?id=3153 终于让哥以一种碉堡的姿势过了: 牛B轰轰的最后两个都是我的...无法超 ...

  9. ROS库生成和调用

      参考资料: 生成.so文件:http://blog.csdn.net/u013243710/article/details/35795841 调用.so文件:http://blog.csdn.ne ...

  10. 原生JS实现的h5小游戏-植物大战僵尸

    代码地址如下:http://www.demodashi.com/demo/12755.html 项目介绍 本项目是利用原生js实现的h5小游戏-植物大战僵尸,主要结合了一下自己对于h5小游戏的理解,结 ...