串结构练习——字符串匹配

Time Limit: 1000MS Memory limit: 65536K

题目描述

  给定两个字符串string1和string2,判断string2是否为string1的子串。

 

输入

 输入包含多组数据,每组测试数据包含两行,第一行代表string1,第二行代表string2,string1和string2中保证不出现空格。

 

输出

 对于每组输入数据,若string2是string1的子串,则输出"YES",否则输出"NO"。

 

示例输入

  1. abc
  2. a
  3. 123456
  4. 45
  5. abc
  6. ddd

示例输出

  1. YES
  2. YES
  3. NO
  4.  
  1. #include <iostream>
  2. #include <string>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <stack>
  7.  
  8. using namespace std;
  9.  
  10. void GET_next(string t, int next[])
  11. {
  12. int j, k;
  13. j=0; k=-1;
  14. next[0]=-1;
  15. int len=t.size();
  16.  
  17. while(j<len )
  18. {
  19. if(k==-1 || t[j]==t[k] )
  20. {
  21. j++;
  22. k++;
  23. next[j]=k;
  24. }
  25. else
  26. k=next[k];
  27. }
  28. }
  29.  
  30. int KMP(string s, string t, int next[] )
  31. {
  32. int i, j;
  33. i=0; j=0;
  34. int len1=s.size();
  35. int len2=t.size();
  36.  
  37. while(i<len1 && j<len2 )
  38. {
  39. if(j==-1 || s[i]==t[j] )
  40. {
  41. i++;
  42. j++;
  43. }
  44. else
  45. j=next[j];
  46. }
  47. if(j==len2 )
  48. cout<<"YES\n";
  49. else
  50. cout<<"NO\n";
  51. return 0;
  52. }
  53.  
  54. int main()
  55. {
  56. string s, t;
  57. int i, j;
  58. int len1, len2;
  59. int next[1000];
  60.  
  61. while(cin>>s)
  62. {
  63. cin>>t;
  64. len1=s.size();
  65. len2=t.size();
  66. GET_next(t, next);
  67. KMP(s, t, next);
  68. }
  69. return 0;
  70. }

注释化:

  1. #include <iostream>
  2. #include <string>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <stack>
  7.  
  8. using namespace std;
  9.  
  10. void GET_next(string t, int next[]) //生成next数组值
  11. {
  12. int j, k;
  13. j=0; //字符串的位置下标的移动指针
  14. k=-1;
  15. next[0]=-1;//此处和课本不同,课本的下标从1开始,而实际是从0开始
  16. int len=t.size();
  17.  
  18. while( j<len ) //t串长度
  19. {
  20. if(k==-1 || t[j]==t[k] )
  21. { //如果k=-1,往后移下标
  22. j++;
  23. k++; //k代表:t1 t2 t3...tk = t(j-k+1) t(j-k+2)...t(j-1)
  24. //的最大值
  25. next[j]=k; //next[当前] 被赋值
  26. }
  27. else
  28. k=next[k]; //k的回退
  29. }
  30. int i;
  31. /*for(i=0; i<len; i++)
  32. {
  33. cout<<next[i]<<" ";
  34. }
  35. cout<<endl; */
  36.  
  37. }
  38. /* 例如:t串:a b a a b c a c
  39. 下标:0 1 2 3 4 5 6 7
  40. next:-1 0 0 1 1 2 0 1
  41. */
  42. int KMP(string s, string t, int next[] )
  43. {
  44. int i, j;
  45. i=0; j=0;
  46. int len1=s.size();
  47. int len2=t.size();
  48. //这是模式匹配过程
  49. while(i<len1 && j<len2 )// i指向母串 j指向子串
  50. {
  51. if(j==-1 || s[i]==t[j] )
  52. { //如果j=-1,(短路运算)直接向后移,因为没有-1的下标
  53. //如果下标合理,就比较二者指针对应的字符是否相等
  54. i++;
  55. j++;
  56. }
  57. else//如果上述两者条件不符
  58. j=next[j]; //让子串的指针j回退,而i不会移动,节省时间
  59. }
  60. if(j==len2 ) //如果跑玩匹配循环 j下标已经指向len2,则说明整个
  61. //子串的字符都已被匹配上
  62. cout<<"YES\n";
  63. else
  64. cout<<"NO\n";
  65. return 0;
  66. }
  67.  
  68. int main()
  69. {
  70. string s, t;
  71. int i, j;
  72. int len1, len2;
  73. int next[1000];
  74. while(cin>>s) //读入母串
  75. {
  76. cin>>t;//读入子串
  77. len1=s.size(); //母串长度
  78. // len2=t.size(); //子串长度
  79.  
  80. GET_next(s, next); //对子串t 生成next数组值
  81. //KMP(s, t, next); //根据next数组进行kmp匹配
  82. }
  83. return 0;
  84. }

数据结构之 字符串---字符串匹配(kmp算法)的更多相关文章

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

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

  2. 字符串匹配--kmp算法原理整理

    kmp算法原理:求出P0···Pi的最大相同前后缀长度k: 字符串匹配是计算机的基本任务之一.举例,字符串"BBC ABCDAB ABCDABCDABDE",里面是否包含另一个字符 ...

  3. 字符串匹配——KMP算法

    关于KMP算法的分析,我觉得这两篇博客写的不错: http://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html ht ...

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

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  5. 字符串匹配KMP算法的讲解C++

    转自http://blog.csdn.net/starstar1992/article/details/54913261 也可以参考http://blog.csdn.net/liu940204/art ...

  6. 字符串匹配KMP算法(转自阮一峰)

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

  7. 【Luogu P3375】字符串匹配KMP算法模板

    Luogu P3375 模式串:即题目中的S2所代表的意义 文本串:即题目中的S1所代表的意义 对于字符串匹配,有一种很显然的朴素算法:在S1中枚举起点一位一位匹配,失配之后起点往后移动一位,从头开始 ...

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

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

  9. 字符串匹配KMP算法

    1. 字符串匹配的KMP算法 2. KMP算法详解 3. 从头到尾彻底理解KMP

随机推荐

  1. Java中泛型T和Class<T>以及Class<?>的理解(转)

    注意:class是java的关键字, 在声明Java类时使用; Class类的实例表示Java应用运行时的类(class ans enum)或接口(interface and annotation)( ...

  2. SQL Server 存储

    http://baoqiangwang.blog.51cto.com/1554549/541298/

  3. 【hibernate】唯一约束 注解

    唯一约束注解 单列约束和联合约束 分别如下 @Table( uniqueConstraints = { @UniqueConstraint(columnNames = "uid") ...

  4. [反汇编练习] 160个CrackMe之029

    [反汇编练习] 160个CrackMe之029. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  5. 三维场景如何嵌入到PPT中展示?

    今天要跟大家一起交流的大体内容如标题所示,日常生活中,ppt已经成为人们工作学习生活中不可或缺的工具之一,那么三维场景是如何在ppt中加载展示的呢?请大家慢慢往下看. 1.创建命令按钮和web bro ...

  6. andrid对不能导入的类,知道类路径怎样使用该类

    andrid对不能导入的类,知道类路径怎样使用该类?使用java的反射机制. 下边是一个样例. MTK平台对Android源生的Telephone接口进行了扩展,加入了一个TelephonyManag ...

  7. 安装mongoDB遇见的一个路径问题

    如果安装路径不存在,则不会解压EXE软件! 安装monogoDB后,它不会自动添加执行路径! 意思就是安装路径是D盘下面的mongoDB文件夹,假如不存在这个文件夹,则不会安装成功 你需要添加路径: ...

  8. sh脚本——#!/bin/bash

    #!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径. bash只是shell的一种,还有很多其它shell,如:sh ...

  9. Linux Apache 给 awstats 创建 訪问password

    CentOS7 安装最新版本号 awstats ,在httpd.conf 中增加了alias,能够直接訪问网址就进入 浏览.十分不安全. 给訪问加上password的方法: [root@localho ...

  10. HDU 1698 Just a Hook(线段树区间替换)

    题目地址:pid=1698">HDU 1698 区间替换裸题.相同利用lazy延迟标记数组,这里仅仅是当lazy下放的时候把以下的lazy也所有改成lazy就好了. 代码例如以下: # ...