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

转载 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. }  

相关文章推荐

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

原文:

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

第一章、左旋转字符串作者:July,yansha。时间:二零一一年四月十四日。微博:http://weibo.com/julyweibo。出处:http://blog.csdn.net/v_JULY_...
  • v_JULY_v
  • v_JULY_v
  • 2011年04月14日 13:14
  • 121848

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

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

程序员编程技术学习笔记——左旋转字符串

给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdefab”。请写一个函数完成此功能...

程序员面试题精选100题(21)-左旋转字符串[算法]

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

读程序员编程艺术第二章---字符串包含问题(二)

上篇中谈到可以通过快速排序将字符串的包含问题的算法时间复杂度优化至O(nlogn)+O(mlogm)+O(m+n),那么还有没有更好的算法时间复杂度呢?可以采用计数排序的方法,排序的时间复杂度为O(m...
  • ivyvae
  • ivyvae
  • 2014年03月20日 13:27
  • 503

程序员编程艺术:第二章、字符串是否包含问题

程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题作者:July,yansha。时间:二零一一年四月二十三日。致谢:老梦,nossiac,Hession,Oliver,luuillu,...
  • v_JULY_v
  • v_JULY_v
  • 2011年04月23日 21:55
  • 94082

程序员编程艺术--2、字符串包含问题

题目描述: 假设这有一个各种字母组成的字符串A,和另外一个字符串B,字符串里B的字母数相对少一些。什么方法能最快的查出所有小字符串B里的字母在大字符串A里都有? 比如,如果是下面两个字符串: S...

程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题

     程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题 作者:July,yansha。 时间:二零一一年四月二十三日。 致谢:老梦,nossiac,Hession...

读程序员编程艺术第二章---字符串包含问题

字符串包含问题: 即一个字符串是否包含另一个字符串。这个问题虽然比较简单,但是想要优化轮询的时间复杂度却不是那么的简单。 最常见的方法就是针对一个字符串的字符,一一与另一个字符串中的字符相比较,看...
  • ivyvae
  • ivyvae
  • 2014年03月19日 22:01
  • 553
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序员编程艺术(算法卷):第一章、左旋转字符串
举报原因:
原因补充:

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