您的位置:首页 > 编程语言

字符串的旋转

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"的前三个字符串移动到尾部变成”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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息