实现一个函数,可以左旋字符串中的k个字符、判断一个字符串是否为另外一个字符串旋转之后的字符串

作者:小琛
欢迎转载,请标明出处
1.实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

思路一:一次一次翻转,共进行k次,每次记录该次的翻转值,将所有位向前进一位,最后将记录的该值给最后一位**(时间复杂度高)**

#include <stdio.h>
void rotating(char *p, int len, int k)
{
	k = k%len;   //化简为最小的翻转次数
	char tmp;
	int i = 0;
	while (k--)  //一共进行k次
	{
		tmp = p[0];  //记录此次翻转的值
		for (i = 0; i < len - 1; i++) //'/0'不进行翻转
		{
			p[i] = p[i + 1];
		}
		p[len-2] = tmp;   //'/0'不进行翻转
	}
}

思路二:先将该字符串的前k个逆置,再将后len-k个逆置,最后将整个字符串逆置
(时间复杂度低,推荐方法)

void rotate_help(int *left,int *right)
{
    while (left<right)
    {
        *left^=*right;
        *right^=*left;
        *left^=*right;
        left++;
        right--;
    }
}
void rotate(int* nums, int numsSize, int k){
    if (nums==NULL||numsSize==1)
    {
        return;
    }
    k=k%numsSize;//排除不必要的旋转
    rotate_help(nums,nums+numsSize-k-1);//先将前numSize-k个逆置
    rotate_help(nums+numsSize-k,nums+numsSize-1);//再将后k个逆置
    rotate_help(nums,nums+numsSize-1);//整体逆置即可达到要求
}

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

思路1:写一个函数,将所有得旋转函数情况都比较一遍,符合返回1,不符合返回0

int judge_fun1(char* src, char* dest)
{
	int len = strlen(src);
	char str; 
	for (int i = 0; i < len-1; i++)
	{
		str = *src;
		for (int j = 0; j < len - 1; j++)
		{
			*src = *(src + 1);
			src++;
		}
		*src = str;
		src = src - len + 1;
		if (!(strcmp(dest, src)))
		{
			return 1;
		}
	}
	return 0;
}
int main()
{
	char p[] = "aeabc";
	char q[] = "abcde";
	int count = 0;
	count = judge_fun1(q, p);
	printf("%d", count);
	return 0;
}

思路2:空间换时间,动态开辟一块内存,将源字符串拷贝一份,再在其后面追加一份,如果是旋转而来,这个新字符串里必包含。

int judge_fun(const char* src, const char* dest)
{
	char* p = (char*)malloc(strlen(src) + strlen(src) + 1);
	strcpy(p, src);
	strcat(p, src);
	if (strstr(p, dest) == NULL)
	{
		return 0;
	}
	else
		return 1;
}
int main()
{
	char p[] = "cdeab";
	char q[] = "abcde";
	int count = 0;
	count = judge_fun(q, p);
	printf("%d", count);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值