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

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2125

题目描述

  给定两个字符串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

提示

代码:

  1. #include<string.h>
  2. #include<iostream>
  3. using namespace std;
  4. char S[],T[];
  5. int s,t,next[],nextval[];
  6. void get_next(char T[],int next[]);//对应模式匹配算法一next函数值
  7. void get_nextval(char T[],int nextval[]);//对应模式匹配算法二nextval函数值
  8. int Index_KMP(char S[],char T[],int pos);//模式匹配算法一
  9. int Index_KMP2(char S[],char T[],int pos);//模式匹配算法二
  10. int main()
  11. {
  12. while(cin>>S>>T)
  13. {
  14. memset(next,,sizeof(next));
  15. int i;
  16. s=strlen(S);
  17. t=strlen(T);
  18. for(i=s;i>=;i--)
  19. S[i]=S[i-];
  20. S[s+]='\0';
  21. for(i=t;i>=;i--)
  22. T[i]=T[i-];
  23. T[t+]='\0';
  24. //get_next(T,next);
  25. get_nextval(T,nextval);
  26. //int flag=Index_KMP(S,T,1);//通过这里可以验证两个算法
  27. int flag=Index_KMP2(S,T,);
  28. //for(i=1;i<=t;i++)
  29. // cout<<nextval[i]<<" ";
  30. //cout<<endl;
  31. if(flag==)cout<<"NO"<<endl;
  32. else cout<<"YES"<<endl;
  33. }
  34. return ;
  35. }
  36. void get_next(char T[],int next[])//对应模式匹配算法一next函数值
  37. {
  38. int i=,j=;
  39. next[]=;
  40. while(i<t)
  41. {
  42. if(j==||T[i]==T[j])
  43. {
  44. ++i;
  45. ++j;
  46. next[i]=j;
  47. }
  48. else j=next[j];
  49. }
  50. }
  51. void get_nextval(char T[],int nextval[])//对应模式匹配算法二nextval函数值
  52. {
  53. int i=,j=;
  54. nextval[]=;
  55. while(i<t)
  56. {
  57. if(j==||T[i]==T[j])
  58. {
  59. ++i;
  60. ++j;
  61. if(T[i]!=T[j])
  62. nextval[i]=j;
  63. else
  64. nextval[i]=nextval[j];
  65. }
  66. else
  67. j=nextval[j];
  68. }
  69. }
  70. int Index_KMP(char S[],char T[],int pos)//模式匹配算法一
  71. {
  72. int i=pos,j=;
  73. while(i<=s&&j<=t)
  74. {
  75. if(j==||S[i]==T[j])
  76. {
  77. ++i;
  78. ++j;
  79. }
  80. else j=next[j];
  81. }
  82. if(j>t)return i-t;
  83. else return ;
  84. }
  85. int Index_KMP2(char S[],char T[],int pos)//模式匹配算法二
  86. {
  87. int i=pos,j=;
  88. while(i<=s&&j<=t)
  89. {
  90. if(j==||S[i]==T[j])
  91. {
  92. ++i;
  93. ++j;
  94. }
  95. else j=nextval[j];
  96. }
  97. if(j>t)return i-t;
  98. else return ;
  99. }

sdut 2125串结构练习--字符串匹配【两种KMP算法】的更多相关文章

  1. 模式字符串匹配问题(KMP算法)

    这两天又看了一遍<算法导论>上面的字符串匹配那一节,下面是实现的几个程序,可能有错误,仅供参考和交流. 关于详细的讲解,网上有很多,大多数算法及数据结构书中都应该有涉及,由于时间限制,在这 ...

  2. 神奇的字符串匹配:扩展KMP算法

    引言 一个算是冷门的算法(在竞赛上),不过其算法思想值得深究. 前置知识 kmp的算法思想,具体可以参考 → Click here trie树(字典树). 正文 问题定义:给定两个字符串 S 和 T( ...

  3. SDUT OJ 数据结构实验之串二:字符串匹配

    数据结构实验之串二:字符串匹配 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  4. [小专题]另一种字符串匹配的思路——Shift-And算法

    吐槽:前两天打组队赛遇到一个字符串的题考了这个(见:http://acm.hdu.edu.cn/showproblem.php?pid=5972 ) 当时写了个KMP瞎搞然后TLE了(害),赛后去查了 ...

  5. Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式

    解析:Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式.面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和Out ...

  6. 数据结构- 串的模式匹配算法:BF和 KMP算法

      数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

  7. I两种冒泡算法

    两种冒泡算法: 第一个循环,I 定位当前坐标,第二个循环 把 I 之后的每个数都与 I 比较(比 I 小的都去坐标I),第二个循环之后 坐标 I 为数组里最小的数值. 效率比较高的冒泡算法: stat ...

  8. C++多字节字符转换为宽字符的两种方法

    目前知道有两种方式:可以提供宽字符与ANSI字符之间的转换, 第一种由COM库提供的函数 char*  _com_util::ConvertBSTRToString(BSTR ); BSTR _com ...

  9. JavaScript 区分中英文字符的两种方法: 正则和charCodeAt()方法

    正则无疑是最强大的判断各种条件的方法, 最近也在研习它, 虽然枯燥, 但仍有乐趣. 用它来判断一个双字节的中文字符也是轻而易举地. 而判断中文字符,  简单且执行效率高. regExpForm.onb ...

随机推荐

  1. BZOJ 1922: [Sdoi2010]大陆争霸

    Description 一个无向图,到一个点之前需要先到其他点,求从第一个点到第 \(n\) 点最短时间. Sol 拓扑+Dijkstra. 跑Dijkstra的时候加上拓扑序... 用两个数组表示 ...

  2. QT 信号与槽connect

    QT 信号与槽connect QT 信号与槽connect connect函数调用几个限制 connect函数代码 QT中信号与槽的连接使用的connect函数是一个静态函数,在类QObject中定义 ...

  3. centos7 & mysql

    首先centos7很坑爹. 其次,在centos7上安装mysql更坑爹. 特此记录一次坑爹历程后的唯一出路. 安装mysql wget http://repo.mysql.com/mysql-com ...

  4. putty快速设置本地代理

    sudo plink -D 127.0.0.1:8888 -l root -P 443 -pw xxx 104.xxx.xxx.xxx

  5. phalcon 前端代码结构

    phalcon 前端举例: (1)  baisic.phtml + basic_ajax_get.phtml + basic_ajax_post.phtml (2)  basic_get.phtml ...

  6. Additive Number

    Additive number is a string whose digits can form additive sequence. A valid additive sequence shoul ...

  7. c#.net Excel中的数据导入到SQL数据库中

    /// <summary>        /// 从Excel 导入学生        /// </summary>        /// <param name=&qu ...

  8. pip安装简单方法

    前提:有网络 wget -c --no-check-certificate https://bootstrap.pypa.io/get-pip.py python get-pip.py

  9. jQuery获取循环中的选中单选按钮radio的值

    1.<input type="radio" name="testradio" value="jquery获取radio的值" /> ...

  10. [Linux]centOS7下RPM安装Perl

    1.下载rpm依赖包,依照顺序安装. perl-parent-0.225-244.el7.noarch   perl-HTTP-Tiny-0.033-3.el7.noarch   perl-podla ...