现在的位置: 首页 > 综合 > 正文

算法研究(一) 旋转字符串的三种算法

2013年12月22日 ⁄ 综合 ⁄ 共 1423字 ⁄ 字号 评论关闭

题目:给定一个长度为n的字符串,将它向左旋转i个位置,例如,str = "abcdefg", n = 7, i = 3,则旋转后,str = "defgabc",要求空间复杂度为1。

一般,解旋转字符串这样的题目,最简单的做法即是先将前i个字符拷贝到临时空间,然后将后n - i个字符前移,最后再将临时空间中的数据拷贝到原字符串的后i个位置上。但这样做会额外浪费i个空间。现给出如下三种算法

• 算法一:

  1. void swap(char* str, int n, int ){                                                                                                                   
  2.   
  3.     int j;  
  4.     for (j = 0; j < i; ++j) {  
  5.   
  6.         int t = str[j];  
  7.         str[j] = str[n - i + j];  
  8.         str[n - i + j] = t;  
  9.     }  
  10. }  
  11.   
  12. void rotate(char* str, int n, int i) {  
  13.       
  14.     if (0 == i || n == i)  
  15.         return;  
  16.   
  17.     int k = n - i;  
  18.     if (i < k) {  
  19.         swap(str, n, i);  
  20.         rotate(str, n - i, i);  
  21.     }  
  22.     else {  
  23.         swap(str, n, k);  
  24.         rotate(str + k, n - k, i - k);  
  25.     }  
  26. }  


 算法二:

  1. void reverse(char*str, int n) {  
  2.   
  3.     int m = n / 2;  
  4.     int i;  
  5.     for (i = 0; i < m; ++i) {  
  6.   
  7.         int t = str[i];  
  8.         str[i] = str[ n - 1 - i];  
  9.         str[n - 1 - i] = t;  
  10.     }  
  11. }  
  12.   
  13. void rotate(char* str, int n, int i) {  
  14.   
  15.     reverse(str, i);  
  16.     reverse(str + i, n - i);  
  17.     reverse(str, n);  
  18. }  


• 算法三:

  1. int gcd(int m, int n) {   
  2.   
  3.     int k = m % n;  
  4.     if (0 == k)  
  5.         return n;  
  6.     else  
  7.         return gcd(n, k);  
  8. }  
  9.   
  10. void rotate(char* str, int n, int i) {  
  11.   
  12.     int k = gcd(n, i);  
  13.     int init;  
  14.     for (init = 0; init < k; ++init) {  
  15.           
  16.         int

抱歉!评论已关闭.