1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string>
  4. #include<string.h>
  5. #define MAXSTRLEN 255 /* 可以在255以内定义最大串长 */
  6. typedef char SString[MAXSTRLEN + ]; /* 0号单元存放串的长度 */
  7. void get_next(SString T, int next[]);
  8. void get_nextval(SString T, int nextval[]);
  9. int Index(SString S, SString T, int pos) {
  10. int i = pos; int j = ;
  11. while (i <= S[] && j <= T[]) {
  12. if (S[i] == T[j]) {++i; ++j;} //继续比较后继字符
  13. else {i = i - j + ; j = ;} //指针后退重新开始匹配
  14. }
  15. if (j > T[]) return i - T[];
  16. else return ;
  17. }
  18.  
  19. int Index_KMP_1(SString S, SString T, int pos) {
  20. int i = pos; int j = ;
  21. int *next = (int *)malloc((T[] + ) * sizeof(int));
  22. get_next(T, next);
  23. while (i <= S[] && j <= T[]) {
  24. if (j == || S[i] == T[j]) {++i; ++j;} //继续比较后继字符
  25. else j = next[j]; //模式串向右移动
  26. }
  27. free(next);
  28. if (j > T[]) return i - T[]; //匹配成功
  29. else return ;
  30. }
  31.  
  32. void get_next(SString T, int next[]) {
  33. int i = , j = ; next[] = ;
  34. while (i < T[]) {
  35. if (j == || T[i] == T[j]) {++i; ++j; next[i] = j;}
  36. else j = next[j];
  37. }
  38. }
  39.  
  40. int Index_KMP_2(SString S, SString T, int pos) {
  41. int i = pos; int j = ;
  42. int *nextval = (int *)malloc((T[] + ) * sizeof(int));
  43. get_nextval(T, nextval);
  44. while (i <= S[] && j <= T[]) {
  45. if (j == || S[i] == T[j]) {++i; ++j;} //继续比较后继字符
  46. else j = nextval[j]; //模式串向右移动
  47. }
  48. free(nextval);
  49. if (j > T[]) return i - T[]; //匹配成功
  50. else return ;
  51. }
  52.  
  53. void get_nextval(SString T, int nextval[]) {
  54. int i = ; nextval[] = ; int j = ;
  55. while (i < T[]) {
  56. if (j == || T[i] == T[j]) {
  57. ++i; ++j;
  58. if (T[i] != T[j]) nextval[i] = j;
  59. else nextval[i] = nextval[j];
  60. }
  61. else j = nextval[j];
  62. }
  63. }
  64. /*
  65. 样例
  66. s:ababcabcacbab
  67. t:abcac */
  68. int main(){
  69. SString S, T;
  70. scanf("%s",S+);
  71. S[]=strlen(S+);
  72. S[S[]+]='\0';
  73.  
  74. scanf("%s",T+);
  75. T[]=strlen(T+);
  76. T[T[]+]='\0';
  77. printf("Index: %d\n", Index(S, T, ));//暴力模式匹配方法
  78. printf("Index_KMP_1: %d\n", Index_KMP_1(S, T, ));//KMP算法
  79. printf("Index_KMP_2: %d\n", Index_KMP_2(S, T, ));//KMP优化算法
  80. }

模式串匹配,kmp的更多相关文章

  1. 模式串匹配KMP详解

    关于KMP模式串匹配网上蛮多的. 对于KMP有自己理解所以写下来希望能够对你们的学习有帮助. 之前暑假的时候学过,然后好长时间没用发现又忘了,现在再看看发现有了新的理解. ============== ...

  2. 模式串匹配之KMP算法

    模式串匹配之KMP算法 KMP算法 模式值计算(next[j]) (1) next[0]=-1,  第一个字符模式值为-1 (2) next[j]=-1, T中下标为j的字符与首字符相同,且j前面的1 ...

  3. 单模式串匹配----浅谈kmp算法

    模式串匹配,顾名思义,就是看一个串是否在另一个串中出现,出现了几次,在哪个位置出现: p.s.  模式串是前者,并且,我们称后一个 (也就是被匹配的串)为文本串: 在这篇博客的代码里,s1均为文本串, ...

  4. hdu 1686 Oulipo 【KMP】(计算模式串匹配的次数——与已匹配的字串可以有交集)

    题目链接:https://vjudge.net/contest/220679#problem/B 题目大意: 输入一个T,表示有T组测试数据: 每组测试数据包括一个字符串W,T,T长度大于W小于100 ...

  5. AC自动机——多模式串匹配的算法思想

    标准KMP算法用于单一模式串的匹配,即在母串中寻求一个模式串的匹配,但是现在又存在这样的一个问题,如果同时给出多个模式串,要求找到这一系列模式串在母串存在的匹配个数,我们应该如何处理呢? 基于KMP算 ...

  6. 字符串匹配KMP算法详解

    1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有比较详细的通俗易懂的讲解,另一方面也怪自己没有沉下心来研究.最近在leetcode上又遇见字符串匹配的题目,以此 ...

  7. 【转载】多模式串匹配之AC自动机

    原文地址:https://www.cnblogs.com/codeape/p/3845375.html 目录 [隐藏] 一.概述 二.AC算法思想 三.字典树tire的构造 四.搜索路径的确定 附录: ...

  8. 字符串匹配-KMP

    节选自 https://www.cnblogs.com/zhangtianq/p/5839909.html 字符串匹配 KMP O(m+n) O原来的暴力算法 当不匹配的时候 尽管之前文本串和模式串已 ...

  9. HDU1686 计算模式串匹配的次数

    题目大意: 输入一个T,表示有T组测试数据: 每组测试数据包括一个字符串W,T,T长度大于W小于1000000,w长度小于10000,计算W匹配到T中成功的次数: 这题很明显要用KMP算法,不然很容易 ...

  10. 《数据结构》之串的模式匹配算法——KMP算法

    //串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstri ...

随机推荐

  1. JavaWeb学习笔记——JSP标准标签库JSTL

  2. TortoiseSVN的相关问题

    图标覆盖问题: 创建一个保存文档的目录,创建一个工作目录,工作目录创建后,没有显示覆盖图标.解决办法如下: 找到设置,在工作目录下右键 打开界面如下: 从包含路径中设置就可以. 目录检出后把它从检出状 ...

  3. 使用Diagnose服务查看Azure网站诊断信息

    注意:当前操作只针对"基本"和"标准"模式的网站(也就是有独立实例的网站) 登陆网站的kudu模式:http://{yoursitename}.scm.chin ...

  4. Google 谷歌网页搜索, 学术搜索

    Google 谷歌网页搜索, 学术搜索 1. 网页搜索引擎-Google * https://letsgg.tk/ * https://google.kfd.me/ 谷歌搜索镜像:  http://d ...

  5. 【转】【Java】利用反射技术,实现对类的私有方法、变量访问

    java关于反射机制的包主要在java.lang.reflect中,structs,hibernate,spring等框架都是基于java的反射机制. 下面是一个关于利用java的反射机制,实现了对私 ...

  6. 序列化模块之 pickle 和 json

    用于序列化的两个模块: json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps ...

  7. python实用笔记,加快编程速度,lamdba,三元运算,open.

    lamdba   表达式.    #   f1=lamdba x:x+1 三元运算                 #    b=True if 1 < 2 else False with op ...

  8. iOS钥匙串

    钥匙串 苹果的"生态圈",钥匙串访问,使用 AES 256 加密算法,能够保证用户密码的安全 钥匙串访问SDK,是苹果在 iOS 7.0.3 版本以后公布的 钥匙串访问的接口是纯 ...

  9. java String 中 intern方法的概念

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  10. 安装opensuse的笔记-重庆linux开源组织

    mate: 伙伴 matey: 融洽的, 易于亲近的. get matey with sb. poison: a. 有毒的, n.毒药/毒酒v. 下毒, 破坏, 污染 slander [ 撕烂的~~] ...