程序员编程艺术(算法卷):第一章、左旋转字符串

转载 2012年03月29日 16:10:40

转载yu:http://blog.csdn.net/v_july_v/article/details/6322882

第一节、左旋转字符串
题目描述:

定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1) 

编程之美上有这样一个类似的问题,咱们先来看一下:

设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),
且只允许使用两个附加变量。

分析:

我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次。
abcd1234→4abcd123→34abcd12→234abcd1→1234abcd。

稍微总结下:
编程之美上,

下面,你将看到,本章里我们的做法是:
1、三次翻转,直接线性
2、两个指针逐步翻转,线性
3、stl的rotate算法,线性

好的,现在,回到咱们的左旋转字符串的问题中来,对于这个左旋转字符串的问题,咱们可以如下这样考虑:
1.1、思路一:

对于这个问题,咱们换一个角度可以这么做:
将一个字符串分成两部分,X和Y两个部分,在字符串上定义反转的操作X^T,即把X的所有字符反转(如,X="abc",那么X^T="cba"),那么我们可以得到下面的结论:(X^TY^T)^T=YX。显然我们这就可以转化为字符串的反转的问题了。

不是么?ok,就拿abcdef 这个例子来说(非常简短的三句,请细看,一看就懂):
1、首先分为俩部分,X:abc,Y:def;
2、X->X^T,abc->cba, Y->Y^T,def->fed。
3、(X^TY^T)^T=YX,cbafed->defabc,即整个翻转。

我想,这下,你应该了然了。
然后,代码可以这么写(已测试正确):

  1. //Copyright@ 小桥流水 && July  
  2. //c代码实现,已测试正确。  
  3. //http://www.smallbridge.co.cc/2011/03/13/100%E9%A2%98  
  4. //_21-%E5%B7%A6%E6%97%8B%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html  
  5. //July、updated,2011.04.17。  
  6. #include <stdio.h>  
  7. #include <string.h>  
  8.   
  9. char * invert(char *start, char *end)  
  10. {     
  11.     char tmp, *ptmp = start;      
  12.     while (start != NULL && end != NULL && start < end)    
  13.     {     
  14.         tmp = *start;     
  15.         *start = *end;        
  16.         *end = tmp;       
  17.         start ++;     
  18.         end --;   
  19.     }  
  20.     return ptmp;  
  21. }  
  22.   
  23. char *left(char *s, int pos)   //pos为要旋转的字符个数,或长度,下面主函数测试中,pos=3。  
  24. {  
  25.     int len = strlen(s);  
  26.     invert(s, s + (pos - 1));  //如上,X->X^T,即 abc->cba  
  27.     invert(s + pos, s + (len - 1)); //如上,Y->Y^T,即 def->fed  
  28.     invert(s, s + (len - 1));  //如上,整个翻转,(X^TY^T)^T=YX,即 cbafed->defabc。  
  29.     return s;  
  30. }  
  31.   
  32. int main()  
  33. {     
  34.     char s[] = "abcdefghij";      
  35.     puts(left(s, 3));  
  36.     return 0;  
  37. }  

程序员编程艺术(算法卷):第一章、左旋转字符串探讨

      看了周磊的程序员编程艺术,很受启发。忍不住手痒,也写了左旋转字符串的代码。      题目描述: 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。      如把字符串...
  • Alcy67125
  • Alcy67125
  • 2011年06月06日 00:48
  • 186

程序员编程艺术(算法卷):第一章、左旋转字符串

第一章、左旋转字符串 http://blog.csdn.net/v_july_v/article/details/6322882 作者:July,yansha。 时间:二零一一年四月十四日。...
  • ShiZhixin
  • ShiZhixin
  • 2012年03月23日 22:51
  • 1276

程序员编程艺术第一章、左旋转字符串

第一章、左旋转字符串 作者:July,yansha。 时间:二零一一年四月十四日。 微博:http://weibo.com/julyweibo。 出处:http://blog....
  • weishiang
  • weishiang
  • 2012年11月27日 16:14
  • 229

【程序员编程艺术】第一章:左旋转字符串

原文:
  • a45872055555
  • a45872055555
  • 2014年06月20日 18:13
  • 593

程序员编程艺术:第一章、左旋转字符串

第一章、左旋转字符串 作者:July,yansha。 时间:二零一一年四月十四日。 微博:http://weibo.com/julyweibo。 出处:http://blog....
  • pediy_yuhan
  • pediy_yuhan
  • 2013年09月18日 15:03
  • 770

程序员编程艺术:面试和算法心得

本文转载至:http://taop.marchtea.com/ 本书是July和他伙伴们的《程序员编程艺术》的电子书 《程序员编程艺术:面试和算法心得》 目录 第一部分 ...
  • robertsong2004
  • robertsong2004
  • 2015年01月15日 12:38
  • 3985

程序员编程艺术_第一章左旋转字符串_C实现

题目描述:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串 abcdef 左旋转 2 位得到字符串 cdefab。请实现字符串左旋转的函数,要求对长度为 n 的字符串操作...
  • pclvmm
  • pclvmm
  • 2014年01月13日 20:56
  • 311

程序员编程艺术1:左旋转字符串

程序员编程艺术系列(简称TAOPP系列),围绕“面试”、“算法”、“编程”三个主题,注重提高广大初学者的编程能力,以及如何运用编程技巧和高效的算法解决实际应用问题。感谢“研究者July“分享的博客,这...
  • shangdizhizi
  • shangdizhizi
  • 2013年12月20日 23:16
  • 315

程序员编程艺术----1、左旋转字符串

题目描述: 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转两位得到字符串cdefab. 请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间...
  • cyongxue
  • cyongxue
  • 2014年02月21日 20:22
  • 451

羊皮卷第一卷

羊皮卷之一今天,我开始新的生活。今天,我爬出满是失败创伤的老茧。今天,我重新来到这个世上,我出生在葡萄园中,园内的葡萄任人享用。今天,我要从最高最密的藤上摘下智慧的果实,这葡萄藤是好几代前的智者种下的...
  • fight_life
  • fight_life
  • 2008年07月29日 09:19
  • 828
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序员编程艺术(算法卷):第一章、左旋转字符串
举报原因:
原因补充:

(最多只允许输入30个字)