字符串的旋转问题

#  字符串的旋转问题


@讨论两方面:1. 旋转字符串 2. 判断字符串是否由另一个字符串旋转而来


(一) 旋转字符串

/*

实现对字符串的左旋和右旋


*/

# 分析

      所谓左旋右旋其实就是移动字符;例如:将abcdef左旋两位得到:cdefab
                                                                       将abcdef右移两位得到:efabcd

      那么,以右旋为例,我们想到的直接最暴力的方法就是直接将最后一位保存一起来,

剩下的元素全部向后挪一位,然后将保存起来的最后一位放入第一位,然后左旋几位,

循环几次;

      但是感觉暴力的方法不够优雅,在这里我们介绍一种妖娆的方法:三步旋转法

三步旋转法:以右旋为例,比如:abcdef 右旋三位,我们先将abc 进行字符串的旋转变成

:cba,再将def旋转得到fed,最后将:cbafed整个进行一次旋转得到:defabc;

如图:



@ 既然举了右旋的例子,那么在这里只实现左旋,右旋实现类似(没猜到的结局吧);

# 代码实现(仔细阅读注释):

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//单独封装一个旋转字符串的函数,方便调用,条理清晰;
void Turn(char *left,char *right)
{
	while(left<right)
	{
		char tmp = 0;
		tmp = *left;
	    *left = *right;
	    *right = tmp;
		left++;
		right--;
	}
}

void Left_string(char *str,int k,int n)
{
	char *start = str;
	char *end = NULL;

	if(k>n)
		return;
	Turn(start,start+k-1);//第一步反转

	while(*str)
	{
		str++;
	}

	end = str-1;
	Turn(start+k,end);//第二步反转
	Turn(start,end);//第三步反转

	printf("%s\n",start);
}

int main()
{
	char str[] = "abcdeffghi";

	Left_string(str,2,strlen(str));

	system("pause");
	return 0;
}

(二) 判断字符串是否由另一个字符串旋转而来

# 分析

那么现在我们进行一下扩展延伸;

既然你可以旋转字符串,那么你就可以判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.


AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC
AABCD右旋两个字符得到CDAAB

/*
其实嘛,这个规律真不是你一眼可以看出来的,你得自己多举例几组数据,自己找规律;

这道题的规律就是:万变不离其宗!  你无论怎么旋转,你的顺序类似其实可以看成一个圆,

如图:


每个字母后面的字母其实是固定的,因为你的旋转不会改变内在的规律;那么我们就可以在源字符串

后面追加一个一样的字符串,无论如何旋转的字符串都是这个新源的字串,那么就简单了!

*/

# 代码实现:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define MAX 50

int my_strstr(char *src,char *dst)//模拟strstr的实现,可以直接调用;
{
	while(*src)
	{
		char *ap = dst;
		char *cp = src;
	
		while((*cp) && (*ap) && (*cp==*ap))
		{
				cp++;
			    ap++;
		}
		if(*ap == '\0')
		{
			return 1;
		}
		if(*cp!='\0')
			src+=1;
	}
	return 0;
}
void Judge_turnstring(char *src,char *dst)
{
	int ret = 0;
	assert(src);
	assert(dst);

	ret = my_strstr(src,dst);//包装函数返回结果;

	if(ret==1)//1代表是旋转后的道德
		printf("YES\n");
	if(ret==0)//0代表不是旋转后得到的
		printf("NO\n");

}

int main()
{
	char src[MAX] = "abcdef";//源字符串
	char dst[] = "efabcd";//需要判断的字符串

	strcat(src,"abcdef");//追加一个一样的字符串;
	//strcat(src,src);注意,给自己追加自己,strcat是做不到的;
	Judge_turnstring(src,dst);

	system("pause");
	return 0;
}


累了就写写代码吧微笑!(感觉拉仇恨)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值