判断字符串旋转
题目要求
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
示例
给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
解答
方法一、
实现思路
先实现一个旋转函数,该函数可以将一个字符串左旋k个字符,实现的具体思路是 :如果将AABCD左旋两个字符,我们可以通过先将前两个字符旋转,结果为AA;再将后三个字符旋转,结果为DCB;此时字符串变为AADCB,再将该字符串旋转,结果就为BCDAA,即实现了将字符串左旋两个字符,通过这个思路我们可以实现将给定的s1字符串旋转0~len-1个字符,然后将s1每次旋转后的结果都和s2比较,如果相等则返回1,如果s1选择了0到len-1个字符后都不和s2相等,则返回0。
时间复杂度和空间复杂度
时间复杂度为:O(N^2)
空间复杂度为:O(1)
代码
#include<stdio.h>
#include<string.h>
void reverse(char* left, char* right)
{
while (left < right)
{
char ch = *left;
*left = *right;
*right = ch;
left++;
right--;
}
}
int is_equal(char* str1, char* str2)
{
while (*str1 != '\0' && *str2 != '\0')
{
if (*str1 == *str2)
{
str1++;
str2++;
}
else
{
return 0;
}
}
if (*str1 == *str2 && *str1 == '\0')
{
return 1;
}
else
{
return 0;
}
}
int is_reverse(char* str1, char* str2)
{
int len = strlen(str1);
int i = 0;
for (i = 0; i < len; i++)
{
reverse(str1, str1 + i);
reverse(str1 + i + 1, str1 + len - 1);
reverse(str1, str1 + len - 1);
if (is_equal(str1, str2))
{
return 1;
}
}
return 0;
}
int main()
{
char arr1[100] = "AABCD";
char arr2[100] = "ABCDA";
if (is_reverse(arr1, arr2))
{
printf("是\n");
}
else
{
printf("不是\n");
}
return 0;
}
方法二、
实现思路
先在s1字符串后面再追加一个s1字符串,然后通过检查该字符串中是否包含s2子串,就可以确实。
时间复杂度和空间复杂度
时间复杂度:O(N)
空间复杂度:O(N)
代码
#include<stdio.h>
#include<string.h>
#include<assert.h>
int is_reverse(char* arr1, char* arr2)
{
assert(arr1 && arr2);
if (strlen(arr1) != strlen(arr2)) //判断两个字符串长度,要是不相等,则直接返回0
{
return 0;
}
strncat(arr1, arr1, strlen(arr1)); //将arr1字符串后面追加arr1字符串
char* ret = strstr(arr1, arr2); //在新的arr1字符串中查找arr2子串,如果找到则返回该子串的地址。
if (ret == NULL)
{
return 0;
}
else
{
return 1;
}
}
int main()
{
char arr1[100] = "AABCD";
char arr2[100] = "DAABC";
if (is_reverse(arr1, arr2))
{
printf("是\n");
}
else
{
printf("不是\n");
}
return 0;
}