字符串的旋转问题
2016-05-29 19:18
363 查看
# 字符串的旋转问题
@讨论两方面: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; }
累了就写写代码吧
!(感觉拉仇恨)
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- C语言实现选择排序、冒泡排序和快速排序的代码示例
- 探讨C语言的那些小秘密之断言