2.判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
穷举
旋转一共有字符串长度种情况,一 一比较
#include<stdio.h>
#include<assert.h>
#include<string.h>
void reverse(char* left,char* right)
{
assert(left!=NULL);
assert(right!=NULL);
while(left<right)
{
char tmp=*left;
*left=*right;
*right=tmp;
left++;
right--;
}
}
void left_move(char* arr, int k)//char arr[]
{
assert(arr !=NULL);
int len = strlen(arr);
assert(k<=len);
reverse(arr,arr+k-1);//逆序左边
reverse(arr+k,arr+len-1);//逆序右边
reverse(arr,arr+len-1);//逆序全部
}
//abcdef共有六种左旋情况
int is_left_move(char* s1,char* s2)
{
int len=strlen(s1);
int i=0;
for(i=0;i<len;i++)
{
left_move(s1,i)
if(strcmp(s1,s2)==0)
return 1;
}
return 0;
}
int main()
{
char arr1[] = "abcdef";
char arr2[]="cdefab";
int ret=is_left_move(arr1,arr2);
if(ret==1)
printf("YES");
else
printf("NO");
return 0;
}
加倍法
abcdef
abcdefabcdef包含全部旋转之后的可能性
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int is_left_move(char* str1, char* str2)
{
//防止字符串长度不一样
int len1 = strlen(str1);
int len2 = strlen(str2);
if (str1 == str2)
{
return 0;
}
//1.在str1字符串后追加一个str1字符串
//strcat-追加库函数
//不可以自己给自己追加,程序会崩溃
//err:strcat(str1,str1);
//strncat-追加库函数
int len = strlen(str1);
strncat(str1, str1, len);
//2.看一下str2是不是str1的子字符串
//strstr找子串的
//找到了:返回str2的首地址,没找到返回NULL
char* ret = strstr(str1, str2);
if (ret == NULL)
{
return 0;
}
else
{
return 1;
}
}
int main()
{
char arr1[30] = "abcdef";
char arr2[] = "cdefab";
int ret = is_left_move(arr1, arr2);
if (ret == 1)
printf("YES");
else
printf("NO");
return 0;
}