字符串旋转问题

实现一个函数,可以左旋字符串中的k个字符。这里用了三种方法,为读者看的清晰,第二种方法的代码做了注释,前两种方法是很常见的;第三种方法是字符串群举法,推荐使用第三种方法。
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<assert.h>
char *left_shift(char *str,int count)
{
	int len = strlen(str);
	count = count%len;
	assert(str);
	while(count--){
		int i = 0;
		char t = str[0];
		for(;i < len - 1;i++){
			str[i] = str[i+1];
		}
		str[i] = t;
	}
	return str;
}
//void Adjust(char *x,char *y)
//{
//	while(x < y){
//		char t = *x;
//		*x = *y;
//		*y = t;
//		x++,y--;
//	}
//}
//char *left_shift(char *str,int count)
//{
//	int len = strlen(str);
//	char *p = NULL;
//	count = count % len;
//	p = str + count - 1;
//	assert(str);
//	Adjust(str,p);
//	Adjust(p+1,str+len-1);
//	Adjust(str,str+len-1);
//	return str;
//}
char *left_shift(char *str,int count)
{
	char *ret = str;
	int len = strlen(str);
	char *stuff = (char*)malloc(64);
	char *p = NULL;
	count = count % len;
	assert(str);
	assert(stuff);
	strcpy(stuff,str);
	strcat(stuff,str);
	p = stuff + count;
	strncpy(str,p,len);
	/*while(len--){
		*str = *p;
		str++,p++;
	}
	*str = '\0';*/
	free(stuff);
	return ret;
}
int main()
{
	char str[] = "1234abcd";
	int count = 101;
	printf("%s\n",left_shift(str,count));
	system("pause");
	return 0;
}
判断一个字符串是否为另外一个字符串旋转之后的字符串
#include<stdio.h>
#include<windows.h>
#include<assert.h>
#include<string.h>
int test(char *str,char *dest)
{
	char *stuff = (char*)malloc(48);
	assert(str);
	assert(dest);
	assert(stuff);
	if(strlen(str) != strlen(dest)){
		return -2;  //返回 -2 表示连字符串的长度都不相等
	}
	strcpy(stuff,str);
	strcat(stuff,str);  //此时 stuff 中能找到左旋和右旋的所有子串
	if(strstr(stuff,dest) == NULL){
		return -1;
	}
	else{
		return 1;
	}
	free(stuff);
}
int main()
{
	char str[] = "abcdef123456";
	char *dest = "cdef123456ab";
	printf("%d\n",test(str,dest));
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值