字符串的旋转

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



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值