问题:给定两个字符串s1和s2,要求判定s2是否能够被通过s1循环移位(rotate)得到的字符串包含。
思路一:
直接对s1进行循环移位,再进行字符串包含你的判断,从而遍历其所有的可能性。
代码:
bool RotateInclude(char *A,char *B)
{
int len = strlen(A);
for(int i=0;i<len;i++)
{
char tmp = A[0];
for(int j=0;j<len-1;j++)
A[j] = A[j+1];
A[len-1] = tmp;
if(strstr(A,B)!=NULL)
return (true);
}
return false;
}
思路二:
以s1=ABCD为例,那么s1循环移位的结果,如下所示:
ABCD——>BCDA——>CDAB——>DABC——>ABCD
把前面移走的数据保留,可以看到
ABCD——>ABCDA——>ABCDAB——>ABCDABC——>ABCDABCD
可以看到s1循环移位的字符串都是字符串s1s1的子字符串。如果s2可以由s1循环移位得到,那么s2一定在s1s1上。至此问题就转化为考察s2是否在s1s1内。
代码:
bool RotateInclude2(char *A,char *B)
{
int len = strlen(A);
char *p = (char*)malloc((2*len+1)*sizeof(char));
strcpy(p,A);
strcat(p,A);
char* pos = strstr(p,B);
if(pos)
return true;
return false;
}
测试程序:
#include <iostream>
using namespace std;
bool RotateInclude(char *A,char *B)
{
int len = strlen(A);
for(int i=0;i<len;i++)
{
char tmp = A[0];
for(int j=0;j<len-1;j++)
A[j] = A[j+1];
A[len-1] = tmp;
if(strstr(A,B)!=NULL)
return (true);
}
return false;
}
bool RotateInclude2(char *A,char *B)
{
int len = strlen(A);
char *p = (char*)malloc((2*len+1)*sizeof(char));
strcpy(p,A);
strcat(p,A);
char* pos = strstr(p,B);
if(pos)
return true;
return false;
}
int main()
{
char A[] = "AABBCD";
char B[] = "CDAA";
char C[] = "ABCD";
char D[] = "CDBA";
cout<<boolalpha<<RotateInclude(A,B)<<endl;//true
cout<<boolalpha<<RotateInclude(C,D)<<endl;//false
cout<<boolalpha<<RotateInclude2(A,B)<<endl;//true
cout<<boolalpha<<RotateInclude2(C,D)<<endl;//false
getchar();
}
REF:
1,编程之美