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

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"。

 

示例输入

abc
a
123456
45
abc
ddd

示例输出

YES
YES
NO

提示

代码:

 #include<string.h>
#include<iostream>
using namespace std;
char S[],T[];
int s,t,next[],nextval[];
void get_next(char T[],int next[]);//对应模式匹配算法一next函数值
void get_nextval(char T[],int nextval[]);//对应模式匹配算法二nextval函数值
int Index_KMP(char S[],char T[],int pos);//模式匹配算法一
int Index_KMP2(char S[],char T[],int pos);//模式匹配算法二
int main()
{
while(cin>>S>>T)
{
memset(next,,sizeof(next));
int i;
s=strlen(S);
t=strlen(T);
for(i=s;i>=;i--)
S[i]=S[i-];
S[s+]='\0';
for(i=t;i>=;i--)
T[i]=T[i-];
T[t+]='\0';
//get_next(T,next);
get_nextval(T,nextval);
//int flag=Index_KMP(S,T,1);//通过这里可以验证两个算法
int flag=Index_KMP2(S,T,);
//for(i=1;i<=t;i++)
// cout<<nextval[i]<<" ";
//cout<<endl;
if(flag==)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return ;
}
void get_next(char T[],int next[])//对应模式匹配算法一next函数值
{
int i=,j=;
next[]=;
while(i<t)
{
if(j==||T[i]==T[j])
{
++i;
++j;
next[i]=j;
}
else j=next[j];
}
}
void get_nextval(char T[],int nextval[])//对应模式匹配算法二nextval函数值
{
int i=,j=;
nextval[]=;
while(i<t)
{
if(j==||T[i]==T[j])
{
++i;
++j;
if(T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
int Index_KMP(char S[],char T[],int pos)//模式匹配算法一
{
int i=pos,j=;
while(i<=s&&j<=t)
{
if(j==||S[i]==T[j])
{
++i;
++j;
}
else j=next[j];
}
if(j>t)return i-t;
else return ;
}
int Index_KMP2(char S[],char T[],int pos)//模式匹配算法二
{
int i=pos,j=;
while(i<=s&&j<=t)
{
if(j==||S[i]==T[j])
{
++i;
++j;
}
else j=nextval[j];
}
if(j>t)return i-t;
else return ;
}

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. ubuntu配置apache的虚拟主机

    ubuntu中apache的配置文件分散在几个文件中,/etc/apache2/apache2.conf将它们组织起来.这样设计有很多好处,这里就不在赘述了.进入正题: 1)配置文件在/etc/apa ...

  2. java抓取快递100信息接口

    package zeze; import java.io.IOException; import org.json.JSONArray; import org.json.JSONException; ...

  3. openerp child_of操作符深度解析

    child_of  此操作符,从代码来看,等价于: [('x','child_of',id)] ==>  x.prarent_left >=id.parent_left && ...

  4. Linux--多网卡的7种Bond模式

    网卡bond是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡.在应用部署中是一种常用的技术,我们公司基本所有的项目相关服务器都做了bond,这里总结整理,以便待查. bond ...

  5. Linux下VMware虚拟机网卡不能运行在混杂模式解决办法

    转自: http://blog.csdn.net/henulwj/article/details/50347489 问题描述 在Linux如果以普通用户运行VMware Workstations,创建 ...

  6. Git的维护(git gc和git fsck)

    原文: http://gitbook.liuhui998.com/4_10.html 一.保证git良好的性能 在大的仓库中, git靠压缩历史信息来节约磁盘和内存空间. 压缩操作并不是自动进行的, ...

  7. 使用keepalived及典型应用

    通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务. eg:当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.栗子:下面来以keepaliv ...

  8. 【leetcode】Integer to Roman

    Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be within t ...

  9. linux学习之一些琐碎知识点

    一.python 问:django中project和app之间到底有什么不同? 答:他们的区别就是一个是配置,另一个是代码. 一个project包含很多个django app以及对它们的配置.技术上, ...

  10. map的使用

    @Override public List<Map<String, Object>> findSchedule(Date beginTime, Date endTime, Lo ...