字符串的旋转
2015-11-08 11:48
232 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="cpp"><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:18px;color:#ff6666;">问题:</span></span>
解决方法:
一、蛮力移位
思路:直接一位一位的往后移动 :abcdef ->bcdefa ->cdefab ->defabc
复杂度分析:对长度为n的字符串来说,假设需要移动m个字符到字符串尾部,那么总共需要m*n次操作,同时设立一个变量保存第一个字符。
时间复杂度:O(mn) 空间复杂度:O(1)
代码如下:
void left( char *s ,int m){
// m为要移动的字符串的长度
char t = s[0];
for(int i =0 ;i < m; i++){
s[i-1]=s[i];
}
s[m-1] = t;
}
void LeftRotateString(char *s ,int n,int m){
//n 为调用的次数 ,m为要转换s的长度
while(n--){
left(s,m);
printf("%s\n",s);
}
}
二、二分反转
思路:实现一个首尾对称反转的函数rotate()及能把abcdef 从中间分开反转成fedcba.
1、分析"defabc",它是由"cbafed"经过rotate()而得到的。
2、将"cbafed"分开分析及"cba" 与 "fed".而这两个字符串是由"abc"和"def"经过rotate()而得到的。
3、综上所述,将原字符串"abcdef"经过三次rotate()即可得到我们想要的结果。
复杂度分析:采用了将字符串先分为两部分,各自反转,最后整体反转。
时间复杂度:O(n) 空间复杂度:O(1)
代码如下:
void rotate(char *s ,int from ,int to){
char t ;
while(from < to){
t = s[from];
s[from ++] =s [to];
s[to--]=t;
}
}
void rotateResult(char *s,int left,int right) {
//left:分段进行左rotate()最后字母所在位, right :字符串总位数
//"abcdef" 到 "defabc" left = 2 ,right =6
rotate(s,0,left);
rotate(s,left+1,right-1);
rotate(s,0,right-1);
}
给定一字符串,要求将字符串前面的若干个字符移到字符串的尾部,例如:将"abcdef"的前三个字符串移动到尾部变成”defabc“
解决方法:
一、蛮力移位
思路:直接一位一位的往后移动 :abcdef ->bcdefa ->cdefab ->defabc
复杂度分析:对长度为n的字符串来说,假设需要移动m个字符到字符串尾部,那么总共需要m*n次操作,同时设立一个变量保存第一个字符。
时间复杂度:O(mn) 空间复杂度:O(1)
代码如下:
void left( char *s ,int m){
// m为要移动的字符串的长度
char t = s[0];
for(int i =0 ;i < m; i++){
s[i-1]=s[i];
}
s[m-1] = t;
}
void LeftRotateString(char *s ,int n,int m){
//n 为调用的次数 ,m为要转换s的长度
while(n--){
left(s,m);
printf("%s\n",s);
}
}
二、二分反转
思路:实现一个首尾对称反转的函数rotate()及能把abcdef 从中间分开反转成fedcba.
1、分析"defabc",它是由"cbafed"经过rotate()而得到的。
2、将"cbafed"分开分析及"cba" 与 "fed".而这两个字符串是由"abc"和"def"经过rotate()而得到的。
3、综上所述,将原字符串"abcdef"经过三次rotate()即可得到我们想要的结果。
复杂度分析:采用了将字符串先分为两部分,各自反转,最后整体反转。
时间复杂度:O(n) 空间复杂度:O(1)
代码如下:
void rotate(char *s ,int from ,int to){
char t ;
while(from < to){
t = s[from];
s[from ++] =s [to];
s[to--]=t;
}
}
void rotateResult(char *s,int left,int right) {
//left:分段进行左rotate()最后字母所在位, right :字符串总位数
//"abcdef" 到 "defabc" left = 2 ,right =6
rotate(s,0,left);
rotate(s,left+1,right-1);
rotate(s,0,right-1);
}
相关文章推荐
- 数据库链接字符串查询网站
- 动易2006序列号破解算法公布
- Flex字符串比较 还有Flex字符串操作
- Ruby实现的矩阵连乘算法
- Ruby中创建字符串的一些技巧小结
- ASP下经常用的字符串等函数参考资料
- 将字符串小写转大写并延时输出的批处理代码
- 将字符串转换成System.Drawing.Color类型的方法
- C#插入法排序算法实例分析
- Lua源码中字符串类型的实现
- Lua性能优化技巧(四):关于字符串
- 字符串聚合函数(去除重复值)
- Ruby中的字符串编写示例
- 总结的5个C#字符串操作方法分享
- sqlserver中求字符串中汉字的个数的sql语句
- sql server字符串非空判断实现方法
- VBS的字符串及日期操作相关函数
- C#实现将千分位字符串转换成数字的方法
- jquery 删除字符串最后一个字符的方法解析
- 超大数据量存储常用数据库分表分库算法总结