如果对于一个字符串A,将A的前面任意一部分挪到后边去形成的字符串称为A的旋转词。比如A=”12345”,A的旋转词有12345,23456,34512,45123和51234。对于两个字符串A和B,请判断A和B是否互为旋转词。
给定两个字符串A和B及他们的长度lena,lenb,请返回一个bool值,代表他们是否互为旋转词。
测试样例:”cdab”,4,”abcd”,4
返回:true
小技巧:寻找互为旋转词只需要需找A+A中有没有B即可。
用KMP算法匹配字符串时间复杂度为O(lena+lenb);
class Rotation {
public:
bool chkRotation(string A, int lena, string B, int lenb) {
if(lena!=lenb)
return false;
string temp=A+A;
return kmp(temp,B);
// write code here
}
bool kmp(string source,string substr)
{
vector<int> next=cal_next(substr);
int i=0;
int j=0;
while(i!=source.size()&&j!=substr.size())
{
if(source[i]==substr[j])
{
++i;
++j;
}
else{
if(j==0)
++i;
else
j=next[j-1];
}
}
if(j==substr.size())
return true;
else
return false;
}
vector<int> cal_next(string substr)
{
int length=substr.size();
vector<int> next(length,0);
for(int i=1;i!=substr.size();++i)
{
int x=i;
do
{
if(substr[i]==substr[next[x-1]])
next[i]=next[x-1]+1;
else
x=next[x-1]+1;
}while(next[x-1])
}
return next;
}
};