关闭

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

379人阅读 评论(0) 收藏 举报

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:262075次
    • 积分:3946
    • 等级:
    • 排名:第8244名
    • 原创:130篇
    • 转载:68篇
    • 译文:0篇
    • 评论:104条
    最新评论