目录
1. 字符串的左旋
2. 判断一个字符串是否为另外一个字符串旋转之后的字符串
1. 字符串的左旋
题目:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
解析:该题有两种解决方法(我能想到的)。
- 第一种:直接暴力解法
#include<stdio.h>
#include<string.h>
//第一个方法:暴力旋转,也就是枚举。
//a是传进来的数组首元素地址,k是要左旋的个数
void leftMoveStrOne(char* a, int k) {
//先计算该数组有多长
size_t len = strlen(a);
//如果k是大于len,说明k旋转了一周或者n周,所以要取模
k = k % len;
for (int i = 0;i < k;i++) {
//将第一个数组元素保存起来
int tmp = a[0];
size_t j = 0;
//这里为什么需要len - 1呢,因为怕越界了
//例如:有5个元素,下标最多到4,而j + 1可能会到5,所以越界了!
for (j = 0;j < len - 1;j++) {
a[j] = a[j + 1];
}
a[len - 1] = tmp;
}
}
int main() {
char str[]= "ABCDE";
leftMoveArrOne(str, 2);
printf("%s", str);
return 0;
/*char str[]= "ABCDE";
leftMoveStrTow(str, 2);
printf("%s", str);*/
return 0;
}
运行结果如下:
- 第二种:三步翻转法,也叫三步逆序法。
//第二种方法:三步翻转法,也叫三步逆序法。
//先写一个逆序的方法
void reverse(char* left, char* right) {
while (left < right) {
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void leftMoveStrTow(char* str, int k) {
size_t len = strlen(str);
k = k % len;
reverse(str, str + k - 1);//第一次翻转
reverse(str + k, str + len - 1);//第二次翻转
reverse(str, str + len - 1);//第三次翻转
}
int main() {
char str[]= "ABCDE";
leftMoveStrTow(str, 2);
printf("%s", str);
return 0;
}
运行结果如下:
2. 判断一个字符串是否为另外一个字符串旋转之后的字符串
题目:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
解析:该题有两种解决方法(我能想到的)。
- 第一种:直接暴力解法
不断地左旋,得到一个新的字符,然后去判断两个字符串是不是相等!
//第一种方法:暴力破解法,枚举
//s1是要匹配的字符串,s2是去匹配s1的字符串
int isLeftMove(char* s1, char* s2) {
size_t lens1 = strlen(s1);
size_t lens2 = strlen(s2);
if (lens1 != lens2) {
return 0;
}
size_t i = 0;
for (i = 0;i < lens1;i++) {
char tmp = s2[0];
size_t j = 0;
for (j = 0;j < lens1 - 1;j++) {
s2[j] = s2[j + 1];
}
s2[lens1 - 1] = tmp;
if (strcmp(s1, s2) == 0) {
return 1;
}
}
return 0;
}
int main() {
char s1[20] = "abcde";
char s2[] = "bcdea";
int flag = isLeftMove(s1, s2);
printf("%d", flag);
return 0;
}
运行结果如下:
- 第二种:拼接比较法
//第二种方法:拼接比较法
int isLeftMovePlus(char* s1, char* s2) {
size_t lens1 = strlen(s1);
size_t lens2 = strlen(s2);
if (lens1 != lens2)
return 0;
char* start = strncat(s1, s1, lens1);
//用strstr()函数判断s2是不是s1的子串
if (strstr(start, s2) == NULL)
return 0;
else
return 1;
}
int main() {
char s1[20] = "abcde";
char s2[] = "bcdea";
int flag = isLeftMove(s1, s2);
printf("%d", flag);
return 0;
}
运行结果如下: