<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);
}