1. 题目描述——字符串旋转结果
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
2. 思路
- 最直接的就是把字符串每左旋一次就比较一次
- 一个巧妙思路:给第一个字符串后面再追加一个本字符串,然后判断,第二个字符串是否是第一个字符串的子串(注意要先确定两个字符串个数是否相同,不同就直接返回0了)

库函数——strcat()
库函数——sterncat()
库函数——strstr()
3. 代码实现1——每左旋一次,就进行比较
//判断一个字符串是否是另一个字符串左旋得到的
#include<stdio.h>
#include<string.h>
void leftStr(char str[], int size, int num)
{
char tem = str[0];
int i = 0;
for (i = 0; i < size; i++)
{
str[i] = str[i + 1];
}
str[size - 1] = tem;
}
int com(char str1[],char str2[])
{
int size1 = strlen(str1);
int size2 = strlen(str2);
if (size1 != size2)
{
return 0;
}
int i = 0;
for (i = 0; i < size1; i++)
{
leftStr(str1, size1, 1); //每次左旋1 个字符,注意这里不是i
if (strcmp(str1, str2) == 0)
{
return 1;
}
}
return 0;
}
int main()
{
char str1[] = "AABCD";
char str2[] = "BCDAA";
int ret = com(str1, str2);
if (ret == 1)
{
printf("yes!\n");
}
else
{
printf("no!\n");
}
return 0;
}

4.代码实现2——巧妙思路
在本身基础上追加字符串的时候,我原本是在传入的字符串后面直接追加了自己,然后程序直接报错栈错误
strncat(str1, str1, size1);

分析:这个地方不能这样写,我们的str1是固定的大小,不能去追加到自身身上, 就是原本arr1传参给str1的时候空间就是固定的了,容纳不了加上的这个strncat加上的大小导致栈崩溃
所以这里我重新创建了一个空间比较大的str3,用它接收我们追加的字符串,然后和str2进行比较。
#define _CRT_SECURE_NO_WARNINGS 1
//判断一个字符串是否是另一个字符串左旋得到的2
#include<stdio.h>
#include<string.h>
int cmpStr(char str1[], char str2[])
{
int size1 = strlen(str1);
int size2 = strlen(str2);
if (size1 != size2)
{
return 0;
}
char str3[20] = " "; //这里试了下,最小需要设置为str3[11] 、str[10]的时候就报错,目前我的理解,是因为字符串的最后面还需要一个'\0’ 所以要给它留11个空间
int i = 0;
for (i = 0; i < size1; i++)
{
str3[i] = str1[i];
}
strncat(str3, str1, size1);
//strncat(str1, str1, size1);//这个地方不能这样写,你的str1是固定的大小,不能去追加到自身身上,
// 就是原本arr1传参给str1的时候空间就是固定的了5个空间大小,容纳不了你加上的这个strncat加上的大小(10个大小)导致栈崩溃
if (strstr(str3, str2) != NULL)
return 1;
else
return 0;
}
int main()
{
char arr1[] = "AABCD";
char arr2[] = "BCDAA";
int ret = cmpStr(arr1, arr2);
if (ret == 1)
{
printf("yes!\n");
}
else
{
printf("no!\n");
}
return 0;
}




1385

被折叠的 条评论
为什么被折叠?



