旋转字符串
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
//旋转字符串
//1.暴力求解法
void left_move(char* arr, int k) {
int i = 0;
int len = strlen(arr);
for (i = 0; i < k; i++) {
//左旋转一个字符
char tmp = *arr;
int j = 0;
//前一个元素变成后一个元素
for (j = 0; j < len-1; j++) {
*(arr + j) = *(arr + j + 1);
//*(arr+j) - 数组第j+1个元素
}
//最后一个元素变成首元素
*(arr + len - 1) = tmp;
}
}
//2.三部翻转法
//1.ab cdef - ba fedc
//2.bafedc - cdefav
//逆序字符串
void reverse(char* left, char* right) {
while (left<right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void left_move2(char* arr, int k) {
int len = strlen(arr);
reverse(arr,arr+k-1);//逆序左边
reverse(arr + k, arr + len - 1);//逆序右边
reverse(arr, arr + len - 1);//逆序整体
}
int main() {
char arr[] = "abcdef";
printf("原字符串:%s\n", arr);
//向左旋转2个字符
left_move(arr, 2);
printf("暴力求解法向左旋转2个字符:%s\n", arr);
//再向左旋转2个字符
left_move2(arr, 2);
printf("三部翻转法再向左旋转2个字符:%s\n", arr);
}
原字符串:abcdef
暴力求解法向左旋转2个字符:cdefab
三部翻转法再向左旋转2个字符:efabcd
判断一个字符串是否为另一个字符串旋转后得到的
方法1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
//判断一个字符串是否为另一个字符串旋转后得到的
void left_move(char* arr, int k) {
int i = 0;
int len = strlen(arr);
for (i = 0; i < k; i++) {
//左旋转一个字符
char tmp = *arr;
int j = 0;
//前一个元素变成后一个元素
for (j = 0; j < len - 1; j++) {
*(arr + j) = *(arr + j + 1);
//*(arr+j) - 数组第j+1个元素
}
//最后一个元素变成首元素
*(arr + len - 1) = tmp;
}
}
//判断是否旋转后字符串是否为另一个字符串
//方法1
int is_left_move(char* s1, char* s2) {
int len = strlen(s1);
int i = 0;
for (i = 0; i < len; i++) {
left_move(s1, 1);
int ret = strcmp(s1, s2);
//strcmp - 如果两个字符串相同返回0,< 返回负数,> 返回正数
if (ret == 0)
return 1;
}
return 0;
}
int main() {
char arr1[] = "abcdef";
char arr2[] = "cdefab";
int ret = is_left_move(arr1, arr2);
if (ret == 1)
printf("Yes\n");
else
printf("No\n");
}
Yes
方法2(不需要先旋转字符串)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
//判断是否旋转后字符串是否为另一个字符串
//方法2
int is_left_move2(char* str1, char* str2) {
int len = strlen(str1);
int len2 = strlen(str2);
if (len != len2) {
return 0;
}
//1.在str1字符串中追加一个str1字符串,len个字符
strncat(str1, str1, len);
//判断str2指向的字符串是否是str1指向的字符串的子串
char* ret = strstr(str1, str2);
if (ret == NULL) {
return 0;
}
else {
return 1;
}
}
int main() {
char arr1[30] = "abcdef";
char arr2[] = "cdefab";
int ret = is_left_move2(arr1, arr2);
if (ret == 1)
printf("Yes\n");
else
printf("No\n");
}
Yes