写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
方法一:
传统做法,将字符串左移或右移(注:左移和右移效果是等效的,关于其字符串长度互补性),对于每次旋转得到的结果与串2进行判断,若满足条件则返回。
#include <iostream>
#include<string.h>
using namespace std;
int LeftRound(char *str1 ,char *str2,int len)
{
int i,j;
char t;
for(i=0;i<len;i++)
{
t=str1[0];
for(j=0;j<len-1;j++)
{
str1[j]=str1[j+1];
}
str1[j]=t;
if(strcmp(str1,str2)==0)//枚举
return 1;
}
return 0;
}
int main()
{
int res;
char str1[100]={0};
char str2[100]={0};
gets(str1);
gets(str2);
res=LeftRound(str1,str2,strlen(str1));
if(res==1)
printf("是旋转后的结果!\n");
else
printf("不是旋转后的结果!\n");
}
方法二:
例AABCD无论怎么旋,旋转后的所有结果,都包含在了AABCDAABCD这个字符串里了。所以做法很简单,只需要将原字符串再来一遍接在后面,然后找一找待查找的字符串是不是两倍原字符串的子集即可。
#include<bits/stdc++.h>
using namespace std;
int findRound(char* str1,char* str2)
{
char t[103]={0};
strcpy(t,str1);
strcat(t,str1);
return strstr(t,str2)!=NULL; //以逻辑结果返回
}
int main()
{
bool res;
char str1[50]={0};
char str2[50]={0};
gets(str1);
gets(str2);
res=findRound(str1,str2);
if(res==1)
printf("是旋转后的结果\n");
else
printf("不是旋转后的结果\n");
return 0;
}