旋轉字串是個經典問題。
要求:時間複雜度O(n),空間複雜度O(1)。
介面描述:http://www.sgi.com/tech/stl/rotate.html
《編程珠璣》、《編程之美》上都有這個問題,關於左旋右旋整個旋的方法我就不說了。
我的想法是,先左右比較,長的一段的大部分移到另一端,再遞迴進行餘下的。
比如:
char str1[] = "abcdefghijklmnopqrstuvwxyz";int mid = 3;// 從第mid個位置對調size_t len = strlen(str1);MyRotate(str1, str1 + mid, str1 + len);
執行過程:
abc defghijklmnopqrstuvwxyzdefghijklmnopqrstuvwx abcyzdefghijklmnopqrstuvwx ayz bcdefghijklmnopqrstuvwx yz a bc
程式如下,非遞迴的版本還沒想好。
#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;char * g_head = NULL;// 為了debugvoid MyRotate(char *const first, char *const middle, char *const last){cout << g_head << endl;int leftLen = middle - first;int rightLen = last - middle;if (leftLen == 0 || rightLen == 0){return ;}if (leftLen <= rightLen){char *dst = first;char *src = middle;int count = rightLen / leftLen * leftLen;for (int i = 0; i < count; ++i){char tmp = *dst;*dst = *src;*src = tmp;++dst;++src;}MyRotate(dst, src, last);} else {char *src = middle - 1;char *dst = last - 1;int count = leftLen / rightLen * rightLen;for (int i = 0; i < count; ++i){char tmp = *dst;*dst = *src;*src = tmp;--dst;--src;}MyRotate(first, src + 1, dst + 1);}}int main(int argc, char **argv){char str1[] = "abcdefghijklmnopqrstuvwxyz";int mid = 3;// 從第mid個位置對調char str2[100];strcpy(str2, str1);g_head = str1;size_t len = strlen(str1);MyRotate(str1, str1 + mid, str1 + len);rotate(str2, str2 + mid, str2 + len);cout << (strcmp(str1, str2) == 0 ? "right" : "wrong") << endl;return 0;}
STL是最強大的,演算法源碼詳見http://www.sgi.com/tech/stl/stl_algo.h,你可以Ctrl+F找下rotate,再看看它的代碼。
網上還找到了這個http://opensource.apple.com/source/gcc/gcc-1640/libstdc++-v3/include/bits/stl_algo.h
STL的源碼看懂了再更新到這裡。