# 字符串的旋转问题
@讨论两方面:1. 旋转字符串 2. 判断字符串是否由另一个字符串旋转而来
(一) 旋转字符串
/*
实现对字符串的左旋和右旋
*/
# 分析:
所谓左旋右旋其实就是移动字符;例如:将abcdef左旋两位得到:cdefab
将abcdef右移两位得到:efabcd
将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
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;
}
累了就写写代码吧
!(感觉拉仇恨)
![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)