题目名称:
字符串左旋
题目内容:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
分析思路:
思路一: 首先左旋字符串,不管左旋多少次,左旋多少个字符,都可以看做是左旋第一个字符K次。
每次都实行同样一个步骤:先将第一个字符取出来,把剩余的字符依次往前挪一位,再把取出的第一个字符放到末尾。重复以上步骤K次。如图所示:
。
思路二: 还是以字符串"ABCDEF"为例,假设左旋2个字符,得到"CDEFAB",那么先逆序"ABCDEF"左边两个字符,"BA", 再逆序"ABCDEF"右边四个字符,"FEDC",最后逆序整个变为"CDEFAB"即为最终结果,这个比较难想,可以封装一个逆序函数,调用三次完成。
思路一代码如下:
void left_spin(char arr[], int k)
{
int len = strlen(arr);
while (k--)
{
char tmp = arr[0];
for (int i = 0; i < len - 1; ++i)
{
arr[i] = arr[i + 1];
}
arr[len - 1] = tmp;
}
}
int main()
{
char arr[] = "ABCDEF";
int k = 0;
scanf("%d", &k);
left_spin(arr, k);
printf("左旋后:%s\n", arr);
return 0;
}
思路二代码如下:
void reverse(char* left, char* right)
{
assert(left && right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "ABCDEF";
int len = strlen(arr);
int k = 0;
scanf("%d", &k);
reverse(arr, arr + k-1);
reverse(arr + k, arr + len - 1);
reverse(arr, arr + len-1);
printf("左旋后:%s\n", arr);
return 0;
}
题目名称:
字符串旋转结果
题目内容:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
思路分析:这题和上一题如出一辙,只是多了判断和右旋。
思路一 : 借用上题思路一的方法封装函数列出左旋右旋所有情况,再进行判断。
思路二: 假设字符串" ABCDEF"左旋,左旋所有结果列举出来有:
BCDEFA、CDEFAB、DEFABC、EFABCD、FABCDE、ABCDEF
所有可能情况都包含在ABCDEFABCDEF中,也就是说上述6个都是ABCDEFABCDEF的子串。
如此,可以用库函数strncat追加ABCDEF自身,再用strstr找子串,进行判断。
思路一代码如下:
int is_round(char arr1[], char arr2[])
{
int len1 = strlen(arr1);
int len2 = strlen(arr2);
if (len1 != len2)
return 0;
for (int i = 0; i < len1; ++i)
{
char tmp = arr1[0];
for (int j = 0; j < len1-1; ++j)
{
arr1[j] = arr1[j + 1];
}
arr1[len1 - 1] = tmp;
if (strcmp(arr1, arr2) == 0)
return 1;
}
return 0;
}
int main()
{
char arr1[] = "ABCDEF";
char arr2[] = "CDEFAB";
int ret = is_round(arr1, arr2);
if (ret == 1)
printf("YES\n");
else
printf("NO\n");
return 0;
}
思路二代码如下:
int is_round(char arr1[], char arr2[])
{
int len1 = strlen(arr1);
int len2 = strlen(arr2);
if (len1 != len2)
return 0;
strncat(arr1, arr1, len1);
char* ret = strstr(arr1, arr2);
if (ret == NULL)
return 0;
else
return 1;
}
int main()
{
char arr1[20] = "ABCDEF";
char arr2[20] = "CDEFAB";
int ret = is_round(arr1, arr2);
if (ret == 1)
printf("YES\n");
else
printf("NO\n");
return 0;
}
这里注意 arr1 追加自身不能超出自身空间范围。