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

Time Limit: 1000MS Memory limit: 65536K

题目描述

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

 

输入

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

 

输出

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

 

示例输入

abc
a
123456
45
abc
ddd

示例输出

YES
YES
NO
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack> using namespace std; void GET_next(string t, int next[])
{
int j, k;
j=0; k=-1;
next[0]=-1;
int len=t.size(); while(j<len )
{
if(k==-1 || t[j]==t[k] )
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
} int KMP(string s, string t, int next[] )
{
int i, j;
i=0; j=0;
int len1=s.size();
int len2=t.size(); while(i<len1 && j<len2 )
{
if(j==-1 || s[i]==t[j] )
{
i++;
j++;
}
else
j=next[j];
}
if(j==len2 )
cout<<"YES\n";
else
cout<<"NO\n";
return 0;
} int main()
{
string s, t;
int i, j;
int len1, len2;
int next[1000]; while(cin>>s)
{
cin>>t;
len1=s.size();
len2=t.size();
GET_next(t, next);
KMP(s, t, next);
}
return 0;
}

注释化:

#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack> using namespace std; void GET_next(string t, int next[]) //生成next数组值
{
int j, k;
j=0; //字符串的位置下标的移动指针
k=-1;
next[0]=-1;//此处和课本不同,课本的下标从1开始,而实际是从0开始
int len=t.size(); while( j<len ) //t串长度
{
if(k==-1 || t[j]==t[k] )
{ //如果k=-1,往后移下标
j++;
k++; //k代表:t1 t2 t3...tk = t(j-k+1) t(j-k+2)...t(j-1)
//的最大值
next[j]=k; //next[当前] 被赋值
}
else
k=next[k]; //k的回退
}
int i;
/*for(i=0; i<len; i++)
{
cout<<next[i]<<" ";
}
cout<<endl; */ }
/* 例如:t串:a b a a b c a c
下标:0 1 2 3 4 5 6 7
next:-1 0 0 1 1 2 0 1
*/
int KMP(string s, string t, int next[] )
{
int i, j;
i=0; j=0;
int len1=s.size();
int len2=t.size();
//这是模式匹配过程
while(i<len1 && j<len2 )// i指向母串 j指向子串
{
if(j==-1 || s[i]==t[j] )
{ //如果j=-1,(短路运算)直接向后移,因为没有-1的下标
//如果下标合理,就比较二者指针对应的字符是否相等
i++;
j++;
}
else//如果上述两者条件不符
j=next[j]; //让子串的指针j回退,而i不会移动,节省时间
}
if(j==len2 ) //如果跑玩匹配循环 j下标已经指向len2,则说明整个
//子串的字符都已被匹配上
cout<<"YES\n";
else
cout<<"NO\n";
return 0;
} int main()
{
string s, t;
int i, j;
int len1, len2;
int next[1000];
while(cin>>s) //读入母串
{
cin>>t;//读入子串
len1=s.size(); //母串长度
// len2=t.size(); //子串长度 GET_next(s, next); //对子串t 生成next数组值
//KMP(s, t, next); //根据next数组进行kmp匹配
}
return 0;
}

数据结构之 字符串---字符串匹配(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. 查找系列合集-二叉查找树BST

    一. 二叉树 1. 什么是二叉树? 在计算机科学中,二叉树是每个结点最多有两个子树的树结构. 通常子树被称作“左子树”(left subtree)和“右子树”(right subtree). 二叉树常 ...

  2. 教你写Linux设备驱动程序:一个简短的教程

    教你写Linux设备驱动程序:一个简短的教程 http://blog.chinaunix.net/uid-20799298-id-99675.html

  3. HDU 3534 Tree (经典树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3534 题意: 给你一棵树,问你有多少对点的距离等于树的直径. 思路: dp[i][0]表示在i的子树中 ...

  4. [LibreOJ β Round #4] 子集

    显然是个二分图,直接求最大独立就行了. #include<bits/stdc++.h> #define ll long long #define pb push_back using na ...

  5. 使用jersey组件向图片资源服务器上传图片报403,405,409 Method Not Allowed错误

    一.错误如下 在使用Jersey进行图片跨服务上传时遇到了如下问题: 二.代码如下 1.pom.xml <dependency> <groupId>com.sun.jersey ...

  6. Java爬取51job保存到MySQL并进行分析

    大二下实训课结业作业,想着就爬个工作信息,原本是要用python的,后面想想就用java试试看, java就自学了一个月左右,想要锻炼一下自己面向对象的思想等等的, 然后网上转了一圈,拉钩什么的是动态 ...

  7. Java线程池的内部实现

    一.线程池介绍 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池可以对线程进行统一的分配.调优和监控,并有以下好处: (1)降低资源消耗. (2)提高响应速 ...

  8. 小W旅游railway

    对于一家铁路公司,我们可以首先使用 Floyd 算法求出任 意两点 x, y 间只经过属于该家铁路公司铁路的最短路,那么在新 图中我们在 x, y 间加一条 x 到 y 最短路对应的花费为边权的边. ...

  9. 使用glReadPixels 读取颜色缓存,深度缓存和模板缓存数据

    glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *p ...

  10. Spring核心(ioc控制反转)

     IoC,Inversion Of Control 即控制反转,由容器来管理业务对象之间的依赖关系,而非传统方式中的由代码来管理. 其本质.即将控制权由应用程序代码转到了外部容器,控制权的转移就是 ...