给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。

本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据0:小规模字符串,测试基本正确性;
  • 数据1:随机数据,String 长度为 10510^510​5​​,Pattern 长度为 101010;
  • 数据2:随机数据,String 长度为 10510^510​5​​,Pattern 长度为 10210^210​2​​;
  • 数据3:随机数据,String 长度为 10510^510​5​​,Pattern 长度为 10310^310​3​​;
  • 数据4:随机数据,String 长度为 10510^510​5​​,Pattern 长度为 10410^410​4​​;
  • 数据5:String 长度为 10610^610​6​​,Pattern 长度为 10510^510​5​​;测试尾字符不匹配的情形;
  • 数据6:String 长度为 10610^610​6​​,Pattern 长度为 10510^510​5​​;测试首字符不匹配的情形。

输入格式:

输入第一行给出 String,为由英文字母组成的、长度不超过 10610^610​6​​ 的字符串。第二行给出一个正整数 NNN(≤10\le 10≤10),为待匹配的模式串的个数。随后 NNN 行,每行给出一个 Pattern,为由英文字母组成的、长度不超过 10510^510​5​​ 的字符串。每个字符串都非空,以回车结束。

输出格式:

对每个 Pattern,按照题面要求输出匹配结果。

输入样例:

  1. abcabcabcabcacabxy
  2. abcabcacab
  3. cabcabcd
  4. abcabcabcabcacabxyz

输出样例:

  1. abcabcacabxy
  2. Not Found
  3. Not Found
  4. 解题思路:看到这道题无疑就是用kmp算法;下面的代码就是kmp算法的模板➕用一个ans记录它是否找到;
    具体的kmp算法思想在我前面的博客有:链接如下:
    https://www.cnblogs.com/yewanting/p/10674340.html
    代码如下:
  1. #include<iostream>
  2. #include<stdio.h>
  3. using namespace std;
  4.  
  5. int next1[];
  6. void getnext(string t ,int tsize)
  7. {
  8. int k = - ;
  9. int j = ;
  10. next1[] = -;
  11. while(j<tsize-)
  12. {
  13. if(k==-||t[j] == t[k])
  14. {
  15. ++j;
  16. ++k;
  17. next1[j] = k;
  18. }else
  19. k = next1[k];
  20.  
  21. }
  22. }
  23.  
  24. int kmp(string s ,string t ,int ssize,int tsize)
  25. {
  26. int i = ;
  27. int j = ;
  28. while(i<ssize&&j<tsize)
  29. {
  30. if(j==-||s[i]==t[j])
  31. {
  32. i++;
  33. j++;
  34. }else
  35. {
  36. j = next1[j];
  37. }
  38. }
  39. if(j==tsize)
  40. {
  41. return i-j+;
  42. }else
  43. return -;
  44. }
  45. string s ;
  46. string t ;
  47. int n ;
  48. int ssize;
  49. int tsize;
  50. int ans ;
  51. int main()
  52. {
  53. cin>>s;
  54. cin>>n;
  55. ssize = s.size();
  56. while(n--)
  57. {
  58. cin>>t;
  59. tsize = t.size();
  60. getnext(t,tsize);
  61. ans = kmp(s,t,ssize,tsize); //用一个ans来记录是否找到匹配
  62. if(ans==-) //若找不到
  63. {
  64. printf("Not Found\n");
  65. }else //找到,则输出后面的字符;
  66. {
  67. for(int i = ans- ;i < ssize; i++)
  68. {
  69. cout<<s[i];
  70. }
  71. cout<<endl;
  72. }
  73.  
  74. }
  75. return ;
  76. }

串的模式之kmp算法实践题的更多相关文章

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

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

  2. 串的模式匹配算法 ------ KMP算法

    //KMP串的模式匹配算法 #include <stdio.h> #include <stdlib.h> #include <string.h> int* get_ ...

  3. hdu 1711 KMP算法模板题

    题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串 ...

  4. 串的应用与kmp算法讲解--学习笔记

    串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...

  5. Java数据结构之字符串模式匹配算法---KMP算法2

    直接接上篇上代码: //KMP算法 public class KMP { // 获取next数组的方法,根据给定的字符串求 public static int[] getNext(String sub ...

  6. Java数据结构之字符串模式匹配算法---KMP算法

    本文主要的思路都是参考http://kb.cnblogs.com/page/176818/ 如有冒犯请告知,多谢. 一.KMP算法 KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基 ...

  7. 串的模式匹配和KMP算法

    在对字符串的操作中,我们经常要用到子串的查找功能,我们称子串为模式串,模式串在主串中的查找过程我们成为模式匹配,KMP算法就是一个高效的模式匹配算法.KMP算法是蛮力算法的一种改进,下面我们先来介绍蛮 ...

  8. KMP算法实践与简单分析

    一.理解next数组 1.约定next[0]=-1,同时可以假想在sub串的最前面有一个通配符"*",能够任意匹配.对应实际的代码t<0时的处理情况. 2.next[j]可以 ...

  9. 串的模式匹配,KMP算法

    串的模式匹配 现考虑一个常用操作,在字符串s(我们称为主串)中的第pos开始处往后查找,看在主串s中有没有和子串p相匹配的的,如果有,则返回字串p第一次出现的位置. 暴力求解 int Index(ch ...

随机推荐

  1. python's ninteenth day for me 类的组合,继承。

    组合: 表示一个类的对象作为另一个类对象的属性. 实例化的过程: 1,创建一个对象. 2,__init__ 给对象添加一些属性,对象默认的名字为self. 3,将self所指向的内存空间返回给实例化他 ...

  2. Android 4学习(8):用户界面 - Fragment

    参考<Professional Android 4 Development> Fragment简介 Fragment是我们可以将Activity分成不同的组成部分,这些组成部分拥有自己的生 ...

  3. krpano之鼠标样式修改

    引入cursors.js. cursors.js代码: <krpano > <events onxmlcomplete="action(qtvrcursor);" ...

  4. MySql 里的IFNULL、NULLIF、ISNULL和IF用法

    isnull(expr) 的用法: 如expr 为null,那么isnull() 的返回值为 1,否则返回值为 0. 实例: select ISNULL(NULL) 输出结果: ) 输出结果: IFN ...

  5. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 3_Linear Algebra Review

    Lecture3   Linear Algebra Review 线性代数回顾 3.1 矩阵和向量3.2 加法和标量乘法3.3 矩阵向量乘法3.4 矩阵乘法3.5 矩阵乘法的性质3.6 逆.转置 3. ...

  6. git配置和使用

    1.注册bitbucket用户登录bitbucket站点https://bitbucket.org/注册一个用户,注册后用户名为linjiqin,邮箱为linjiqin@dkhs.com. 2.Cre ...

  7. Oracle字符集的查看查询和Oracle字符集的设置修改(转)

    最近郁闷的字符集2014年7月31日16:32:58 本文主要讨论以下几个部分:如何查看查询oracle字符集. 修改设置字符集以及常见的oracle utf8字符集和oracle exp 字符集问题 ...

  8. CronTrigger表达式和Quartz使用实例入门

    CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,如每月8日发工资的定时任务. CronTrigger,你可以 ...

  9. Java “hello word” 第一天

    //新建包和类 //java是包,c#是命名空间package test1;/** * 需求:练习一个hello word * 思路: * 1.定义一个类,因为java程序都是以类的形式存在的,类的形 ...

  10. Linux Java Meven环境变量设置

    linux中的环境变量设置,可以在两个地方设置.他们分别是: /etc/profile  在这个文件下设置表示全局的,所有用户有效. 用户工作目录,用 ls -a查看,可以看到有一个.bash_pro ...