题目:
如果一个字符串str,把字符串str前面任意的部分挪到后面形成的字符串叫做str的旋转词。比如str="12345",str的旋转词有"12345"、"23451"、"34512"、"45123"、和"51234"。给定两个字符串a和b,请判断a和b是否互为旋转词。
举例:
a = "cdab", b = "abcd", 返回true
a = "1ab2", b = "ab12", 返回false
a = "2ab1", b = "ab12", 返回true
要求:
如果a和b长度不一样,那么a和b必然不互为旋转词,可以直接返回false。当a和b长度一样,都为N时,要求解法的时间复杂度为O(N)。
分析:
这道题考察的是一个字符串的查找的小技巧,我们就举a = "cdab", b = "abcd",这个例子。首先stringb2 = b + b,那么b2中所存储的字符串内容就是abcdabcd,接着我们需要在b2这个字符查找,a是不是b2的子串就可以了,如果是,则返回true,否则返回false。编程风格采选STL
//判断两个字符串是否互为旋转词
#include<iostream>
#include<string>
using namespace std;
bool isRotation(string a, string b);
int main()
{
string a, b;
while(cin>>a>>b)
{
if(isRotation(a, b))
cout<<a<<"和"<<b<<"互为旋转词"<<endl;
else
cout<<a<<"和"<<b<<"不互为旋转词"<<endl;
}
return 0;
}
bool isRotation(string a, string b)
{
if(a.length() == 0 || b.length() == 0 || a.length() != b.length())
return false;
string b2 = b + b;
if(b2.find(a) < b.length())
return true;
return false;
}