- 实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
问题分析
假设字符串为ABCD
我们从第二个开始左旋
我们可以将这个过程分逐步分解
从第二左旋,意思为从B开始
因此我们将字符串可划分为 A B CD
我们可以将CD看为一个整体,与B进行位置交换 实现 A CD B
接着将A 与 CD 进行交换 实现 CD A B 达到目的
因此我们可以设定一个指针指向要左旋字符串的前一个位置,另一个指针指向所要左旋字符串的后一个位置,依此来实现交换。
程序实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void left_move(char *str, int k)
{
assert(str != NULL);
char *p1 = NULL;
char *p2 = NULL;
char tmp = 0;
p1 = str ;
p2 = str;
int len = strlen(str);
int i = 0;
int t = 0;
for (t = 0; t < k; t++)
{
tmp = *(p1 - 1 + k-t); //保存前一个要转移的字符
for (i = 0; i < len - k ; i++) //后面依次往前移动
{
*(p1 + k - 1 + i - t) = *(p1 + k + i - t);
}
*(p2 + len - 1 - t) = tmp; //将保存的字符向后移动
}
}
int main()
{
char arr[50] = { 0 };
int n = 0;
printf("请输入字符串:");
scanf("%s", &arr);
do
{
printf("请输入从第几个字符开始反转(n<=%d):",strlen(arr));
scanf("%d", &n);
} while (n <= 0 || n > strlen(arr));
left_move(arr, n);
printf("%s\n", arr);
system("pause");
return 0;
}
- 判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
问题分析
此问题为上一问题的延伸
假设所要比较的字符串为:S1=AEBCD S2=BCDAE
我们只需要一次将字符从第一个往最后字符依次左旋,然后依次与S2进行比较
第一步
比较2个字符在左旋0个时是否相同,则2个字符直接比较。
第二步
将字符串划分为 A EBCD
将A 与 ABCD位置交换,达到左旋一次的目的
交换后为ABCD A
与S2比较,不相同,继续比较
第三步
比较左旋2次是否相等,左旋两次只需要在上一次的基础上左旋一次即可得到
上一次左旋后为EBCD A
将其划分为 E BCDA
将A 与 BCDA 进行交换
得到 BCDA E
与S2比较,相同 return 1;
…
若最后一位左旋完之后还不相同
return 0;
代码实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
int is_left_move(char *str, const char *p)
{
assert(str != NULL);
char *p1 = NULL;
char *p2 = NULL;
char tmp = 0;
p1 = str;
int len = strlen(str);
int i = 0;
int k = 0;
if (strcmp(str, p) == 0)
return 1;
for (k = 1; k < strlen(str); k++)
{
tmp = *(p1); //保存第一个字符
for (i = 0; i < len-1; i++) //剩余向前移动
{
*(p1 + i) = *(p1 + i + 1);
}
*(p1 + len - 1) = tmp; //将保存的字符移动到最后位置上
if (strcmp(str, p) == 0)
return 1;
}
return 0;
}
int main()
{
char arr[] = "AEBCD";
char arr1[] = "BCDAE";
int ret = 0;
ret = is_left_move(arr, arr1);
if (ret == 1)
printf("是\n");
else
printf("不是\n");
system("pause");
return 0;
}