C语言第26天,练习题,旋转字符串 || 判断一个字符串是否为另一个字符串旋转后得到的

旋转字符串

#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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值