C语言问题---字符串旋转结果(左右旋)
Posted 4nc414g0n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言问题---字符串旋转结果(左右旋)相关的知识,希望对你有一定的参考价值。
问题:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
利用库函数(判断 最简方法)
两倍str1,判断str2是否为str1的字串
strcat与strncat:
- 由于strcat本质上是把被增长的字符串的’\\0’与增长字符串的元素交换实现的,那么当增长的是本身的时候,’\\0’会和前面的元素交换,当所有交换完毕以后会发现’\\0’又跑到后面去了,这样终止条件便再也不成立,会陷入到死循环当中;strcat()方便之处在于只用传两个参数能够实现,比较简便
- 建议采用strncat(),由于不会出现上述的陷入死循环的可能,顶可能是多算一步长度(strlen(数组名)),而且strncat()有一个不可或缺的优点,是可以自由的控制要增长的字符
strstr:
- C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\\0’。
int is_string_rotate(char* str1, char* str2)
{
//长度不相等,肯定不是旋转得到的
//AABCDAABCD
//BCD
if (strlen(str1) != strlen(str2))
{
return 0;
}
//1. str1字符串的后边追加一个str1
//AABCDAABCD
int len = strlen(str1);
strncat(str1, str1, len);
//2. 判断str2是否为str1的字串
char* ret = strstr(str1, str2);
if (ret == NULL)
{
return 0;
}
else
{
return 1;
}
//简写 return ret != NULL;
}
int main()
{
char arr1[20] = "AABCD";
char arr2[] = "BCDAA";
int ret = is_string_rotate(arr1, arr2);
if (ret == 1)
{
printf("yes\\n");
}
else
{
printf("no\\n");
}
return 0;
}
三部反转法(左旋)
#include <assert.h>
//三步反转法
void reverse(char* left, char* right)
{
assert(left);
assert(right);
while (left<right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void string_left_rotate(char* str, int k)
{
assert(str);
int n = strlen(str);
reverse(str, str+k-1);//左
reverse(str+k, str+n-1);//右
reverse(str, str+n-1);//整体
}
int main()
{
char arr[10] = "ABCDEF";
int k = 4;
string_left_rotate(arr, k);
printf("%s\\n", arr);
return 0;
}
以上是关于C语言问题---字符串旋转结果(左右旋)的主要内容,如果未能解决你的问题,请参考以下文章