C语言字符串的旋转

1.字符串的任意次数左旋转
方法1.(时间复杂度O(n^2))

#include<stdio.h>
#include<windows.h>
#include<assert.h>
#pragma warning(disable:4996)
void Rotate(char *arr, int len,int num){//len字符串长度,num旋转次数
	assert(arr != NULL);
	assert(len >= 0);
	assert(num >= 0);
	num %= len;
	while (num){//旋转次数的判断
		char a = arr[0];//保存字符串的首字符
		int i =0;
		for (; i <len-1; i++){
			arr[i] = arr[i + 1];//依次将后面的字符往前面挪
		}
		arr[len - 1] = a;//再将首字符放到字符串的尾
		num--;
	}
}
int main(){
	char arr[] = "1234ABCD";
	int num = 0;
	printf("请输入旋转次数:");
	scanf("%d", &num);
	printf("before rotate:%s\n", arr);
	int len = strlen(arr);
	Rotate(arr, len, num);
	printf("after  rotate:%s\n", arr);
	system("pause");
	return 0;
}

方法二:时间复杂度O(n)
如字符串ABCDEF左旋三次
可将前三个字符ABC 逆置 CBA
再将后三个字符DEF逆置 FED
逆置后字符串为CBAFED
再整体逆置,字符串为DEFABC
左旋三次成功

#include<stdio.h>
#include<windows.h>
#include<assert.h>
#pragma warning(disable:4996)
//ABC  DEF
//DEFABC
//CBA  FED
//DEFABC
int Rotate(char *arr,int start,int end ){//逆置函数
	while (start <= end){
		char temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
		start++;
		end--;
	}
}
void LeftRotate(char *arr, int len, int num){//len字符串长度,num旋转次数
	assert(arr != NULL);
	assert(len >= 0);
	assert(num >= 0);
	num %=len;
	//[0,num-1]
	Rotate(arr, 0,num-1);
	//printf("%s\n", arr);//测试
	//[num,len-1]
	Rotate(arr,num,len-1);
	//printf("%s\n", arr);//测试
	//[0,len-1]
	Rotate(arr, 0,len-1);
	//printf("%s\n", arr);//测试
}
int main(){
	char arr[] = "1234ABCD";
	int num = 0;
	printf("请输入旋转次数:");
	scanf("%d", &num);
	printf("before rotate:%s\n", arr);
	int len = strlen(arr);
	LeftRotate(arr, len, num);
	printf("after  rotate:%s\n", arr);
	system("pause");
	return 0;
}

练习
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC

使用上面两个方法也可以,只需在main在每循环依次判断依次就行
另一种方法:

#include<stdio.h>
#include<windows.h>
#include<string.h>
#pragma warning(disable:4996)
int main(){
	char *s= "1234ABCD";
	char *s2 = "34ABCD1";
	int len1 = strlen(s);
	int len2 = strlen(s2);
	if (len1 != len2){
		printf("no!\n");
	}
	else{
		char *str = (char*)malloc(2 * len1 + 1);
		strcpy(str, s);
		strcat(str, s);
		if (strstr(str, s2) != NULL){
			printf("yes!");
		}
		else{
			printf("no!");
		}
		free(str);
	}
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值