8592 KMP算法



时间限制:1000MS  内存限制:1000K



题型: 编程题   语言: 无限制

描写叙述



用KMP算法对主串和模式串进行模式匹配。

本题目给出部分代码。请补全内容。

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "iostream.h"
  4. #define TRUE 1
  5. #define FALSE 0
  6. #define OK 1
  7. #define ERROR 0
  8. #define INFEASLBLE -1
  9. #define OVERFLOW -2
  10. #define MAXSTRLEN 255 //用户可在255以内定义最大串长
  11. typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存放串的长度
  12.  
  13. void get_next(SString T,int next[]){
  14. // 算法4.7
  15. // 求模式串T的next函数值并存入数组next
  16. // 请补全代码
  17.  
  18. }
  19.  
  20. int Index_KMP(SString S,SString T,int pos){
  21. // 算法4.6
  22. // 利用模式串T的next函数求T在主串S中第pos个字符之后的位置
  23. // KMP算法。
  24.  
  25. 请补全代码
  26.  
  27. }
  28. void main()
  29. {
  30. SString T,S;
  31. int i,j,n;
  32. char ch;
  33. int pos;
  34. scanf(“%d”,&n); // 指定n对需进行模式匹配的字符串
  35. ch=getchar();
  36. for(j=1;j<=n;j++)
  37. {
  38. ch=getchar();
  39. for( i=1;i<=MAXSTRLEN&&(ch!='\n');i++) // 录入主串
  40. {
  41. S[i]=ch;
  42. ch=getchar();
  43. }
  44. S[0]=i-1; // S[0]用于存储主串中字符个数
  45. ch=getchar();
  46. for( i=1;i<=MAXSTRLEN&&(ch!='\n');i++) // 录入模式串
  47. {
  48. T[i]=ch;
  49. ch=getchar();
  50. }
  51. T[0]=i-1; // T[0]用于存储模式串中字符个数
  52. pos= ; // 请填空
  53. printf("%d\n",pos);
  54. }
  55. }

输入格式



第一行:输入n,表示有n对字符串须要匹配

第二行:输入第1个主串

第三行:输入第1个模式串

第四行:输入第2个主串

第五行:输入第2个模式串

……

倒数二行:输入第n个主串

最后一行:输入第n个模式串



输出格式



第一至第n行:输出每对应模式串的匹配值

输入例子



4

oadhifgoarhglkdsa

oar

abcdefg

dec

algeojflas

ojf

jfaweiof

of

输出例子



8

0

5

7

实现方法例如以下:

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "iostream.h"
  4. #define TRUE 1
  5. #define FALSE 0
  6. #define OK 1
  7. #define ERROR 0
  8. #define INFEASLBLE -1
  9. #define OVERFLOW -2
  10. #define MAXSTRLEN 255 //用户可在255以内定义最大串长
  11. typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存放串的长度
  12.  
  13. void get_next(SString T,int next[]){
  14. // 算法4.7
  15. // 求模式串T的next函数值并存入数组next
  16. // 请补全代码
  17.  
  18. int i=1,j=0;
  19. next[1]=0;
  20. while(i<T[0])
  21. {
  22. if(j==0||T[i]==T[j])
  23. {
  24. ++i;
  25. ++j;
  26. next[i]=j;
  27. }
  28. else j=next[j];
  29. }
  30.  
  31. }
  32.  
  33. int Index_KMP(SString S,SString T,int pos)
  34. {
  35. // 算法4.6
  36. // 利用模式串T的next函数求T在主串S中第pos个字符之后的位置
  37. // KMP算法。
  38.  
  39. 请补全代码
  40. int i=pos=1,j=1;
  41. int next[256];
  42. while(i<=S[0]&&j<=T[0])
  43. {
  44. if(j==0||S[i]==T[j])
  45. {
  46. ++i;
  47. ++j;
  48. }
  49. else
  50. {
  51. get_next(T,next);
  52. j=next[j ];
  53. }
  54. }
  55.  
  56. if(j>T[0])
  57. return i-T[0];
  58. else
  59. return 0;
  60. }
  61.  
  62. int main()
  63. {
  64. SString T,S;
  65. int i,j,n;
  66. char ch;
  67. int next[256];
  68. int pos;
  69. scanf("%d",&n); // 指定n对需进行模式匹配的字符串
  70. ch=getchar();
  71. for(j=1;j<=n;j++)
  72. {
  73. ch=getchar();
  74. for( i=1;i<=MAXSTRLEN&&(ch!='\n');i++) // 录入主串
  75. {
  76. S[i]=ch;
  77. ch=getchar();
  78. }
  79. S[0]=i-1; // S[0]用于存储主串中字符个数
  80. ch=getchar();
  81. for( i=1;i<=MAXSTRLEN&&(ch!='\n');i++) // 录入模式串
  82. {
  83. T[i]=ch;
  84. ch=getchar();
  85. }
  86. T[0]=i-1; // T[0]用于存储模式串中字符个数
  87. //pos=Index_KMP(S,T,1); // 请填空
  88. pos=Index_KMP(S,T,pos);
  89. printf("%d\n",pos);
  90. }
  91. return 0;
  92. }

8592 KMP算法的更多相关文章

  1. 简单有效的kmp算法

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

  2. KMP算法

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

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

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

  4. KMP算法实现

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

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

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

  6. 扩展KMP算法

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

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

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

  8. 算法:KMP算法

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

  9. BF算法与KMP算法

    BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的 ...

随机推荐

  1. jquery ajax调用返回json格式数据处理

    Ajax请求默认的都是异步的 如果想同步 async设置为false就可以(默认是true) var html = $.ajax({ url: "some.php", async: ...

  2. lokijs

    http://lokijs.org/#/ 500,000+ 1.1M ops/s. A fast, in-memory document-oriented datastore for node.js, ...

  3. hdu 2896 病毒侵袭 AC自动机 基础题

    病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. 用定时器T0的中断控制8位LED闪烁

    #include<reg52.h> #define uchar unsigned char #define uint unsigned int uint i; void main() { ...

  5. spring利用扫描方式对bean的处理(对任何版本如何获取xml配置信息的处理)

    利用扫描的方式将组件注入容器,就也可以不用操作bean来实例化对象了. 下面我做一个例子 我用的spring3.2.2版本的 首先写一个spring.xml. <?xml version=&qu ...

  6. MSSQL - Sqlcommand

    Command对象:·Command对象也称为数据库连接对象,Command对象主要执行包括添加.删除.修改.查询数据的操作命令.也可以用来执行存储过程. 属性:CommandType属性. 执行存储 ...

  7. 用 Eclipse 下载 Git 仓库中代码

    1. 安装 Git 插件 可以按照 通过Eclipse从subversion站点下载源码 中的方法安装,也可以在 Eclipse Marketplace 中搜索 EGit 进行安装(Help --&g ...

  8. [整理]MongoDB 经常使用命令总结

    MongoDB 经常使用命令总结 简单的的增删改查数据 在查询结果中指定显示或者不显示某个字段 比如,我们希望在 lessons 集合中查找全部数据,可是不希望在返回结果中包括 slides 字段:由 ...

  9. Swift - 使用NSURLSession加载数据、下载、上传文件

    NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍. 1,使用Data Task加载数据 使用全局的sharedSession()和dataTaskWithR ...

  10. IOS开发之UIView的基本使用

    一.视图 1. iphone手机上的窗口就是UIWindow类的一个实例(1个手机应用只有一个UIWindow). 2.UIView类用于实现视图. UIView提供了方法来添加和删除子视图.一个视图 ...