题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2203
题目大意:给出两个字符串,长度最长为十万,问能不能通过左移字符串A,使得字符串B是A的字串。如果是则输出yes,否则输出no.
题目分析:要通过左移使得A是B的子串,可以用KMP算法进行匹配,但关键在于左移的操作会占用大量的时间,因为长度最长为十万。如何减少左移带来的操作量呢?我们分析发现,左移的操作就是将字符串A的第 一个字符放到最后一个,进行匹配,不行再移动现在的A串(已经移动过一次)的第一个放到最后一个,我们发现,每移一次到尾部,就相当于在原来的串A再加上一个串A,这样就直接省掉很多的力气,直接匹配就完了。
View Code
Problem : 2203 ( 亲和串 ) Judge Status : Accepted
RunId : 6352450 Language : G++
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
RunId : 6352450 Language : G++
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string a, b, temp;
long i, len, j, pos;
while( cin >> a >> b )
{
if( a.length() < b.length() ) { cout << "no" << endl; continue; }
a+=a; pos=-1;
pos=a.find(b); //find()函数是C++里面string类的函数,它在串中查找串b,如果找到则返回串b在串a中的匹配的起始位置,如果不能匹配,则返回-1;更详细的了解可以去这个网站:http://www.cplusplus.com/info/
if( pos != -1 ) cout << "yes" << endl;
else cout << "no" << endl;
}
return 0;
}