旋轉字串(迴圈移位,rotate)

來源:互聯網
上載者:User

旋轉字串是個經典問題。

要求:時間複雜度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的源碼看懂了再更新到這裡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.