字串旋轉問題

2021-07-11 05:56:44 字數 2468 閱讀 9452

有一道關於字串旋轉的題比較有意思,拿來和大家分享一下,題目是這樣的:

實現乙個函式,可以左旋字串中的k個字元。

例如:aabcd左旋乙個字元得到abcda,aabcd左旋兩個字元得到bcdaa

現在就來講講這個三步旋轉法是怎麼實現左旋的,先假設 k 的值為 1 :

1、把原字串整體逆序----------------------->>>dcbaa;

2、把左半部分的字串(dcba)逆序--->>>abcda;

3、把右半部分的字串(a)逆序---------->>>abcda

當k為其它值的時候也是使用的哦!

按照我以前的套路,先把整個程式框架建起來:

#include #include #include int main()

標頭檔案我們也先擺在這裡,一會要用到,接下來是字串左旋函式的具體實現:

char * left_move(char * src, int k)

for (i = 0; i < (len - k) / 2; i++) //左串逆序

for (i = 0; i < k / 2; i++) //右串逆序

return src;

}

也就是連續三次字串的逆序,是不是覺得很簡單呢!

這個程式還可以優化一下,比如把其中多次用到的逆序操作封裝成乙個函式,這樣,整個程式看起來可以更加的簡潔! 這裡我偷個懶就不再改了。

這道題還有乙個ii版本,也讓我們來分析一下:

判斷乙個字串是否為另外乙個字串旋轉之後的字串。

例如:給定s1 = aabcd和s2 = bcdaa,返回1,給定s1=abcd和s2=acbd,返回0.

由於我們已將有了左旋的函式了,所以這道題也就不難了。想一想,其實只要我們每次旋轉乙個字元,然後比較一下,這樣一圈下來,結果不就出來了嗎?

但要注意的是,字串的 旋轉可不僅有左旋,還有右旋!那麼對於右旋的情況怎麼辦呢?要再實現乙個右旋函式麼?

其實仔細想想,完全沒有這個必要:我們只需先依次左旋s1再與s2進行比較,發現不相等,就接著左旋s2然後與s1進行比較就好了,腦筋轉不過來彎不妨畫個圖看看吧

現在就來改一改上面的程式:

#include #include #include /*

* 實現乙個函式,可以左旋字串中的k個字元。

* aabcd左旋乙個字元得到abcda

* aabcd左旋兩個字元得到bcdaa

*/char * left_move(char * src, int k)

for (i = 0; i < (len - k) / 2; i++) //左串逆序

for (i = 0; i < k / 2; i++) //右串逆序

return src;

}/*

* 判斷乙個字串是否為另外乙個字串旋轉之後的字串。

* 例如:給定s1 = aabcd和s2 = bcdaa,返回1,給定s1=abcd和s2=acbd,返回0.

*/int is_string_move(char * left, char * right)

for (i = 0; i < len1; i++) //依次左移right串與left比較,相當於右移left串與right比較

return 0;

}int main()

這樣肯定是可以的,但是這樣的效率是不怎麼高的!所以我就又想了想,其實還可以這樣做:

s1 = aabcd和s2 = bcdaa,我們把s1變為aabcdaabcd,這樣,我們只需在其中查詢是否包含s2這個子串就好了!因為修改後的s1包含了所有旋轉後的可能的情況。

新實現的**如下:

int is_string_move2(char * left, char * right)

仔細看看上面這段**,看起來似乎可以,然而我們編譯執行一下,發現崩潰了!為什麼?

原來是strcat()這個函式出了問題,因為strcat是把str拷貝到str的末尾,所以會出現永遠拷不完的情況,開始時str要移到str的末尾

然後把str字元挨個拷到str末尾,變成這樣:

發現str永遠拷不完了!

所以我們改用strncat()函式,是乙個相對來說較安全的乙個函式,每次呼叫可以指定拷多少個字元:

int is_string_move2(char * left, char * right)

這樣程式就沒有問題了!

旋轉字串問題

問題 給定乙個字串,要求把字串前面的若干個字元移動到字串的尾部,如把字串 abcdef 前面的2個字元 a 和 b 移動到字串的尾部,使得原字串變成字串 cdefab 請寫乙個函式完成此功能,要求對長度為n的字串操作的時間複雜度為 o n 空間複雜度為 o 1 剛開始遇到這個問題,很自然的就是想要使...

字串旋轉

問題 把字串前面的若干個字元移動到字串的尾部。如把字串abcdef前2位字元移到後面得到字串cdefab。要求時間對長度為n的字串操作的複雜度為o n 輔助記憶體為o 1 看到大多數的帖子都是進行三次旋轉 如 個人感覺這思路確實比較新穎,但是總感覺有點麻煩了,個人思路如下 include inclu...

字串旋轉

字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。例如 aabcd左旋乙個字元得到abcda aabcd左旋兩個字元得到bcdaa 同理字串右旋操作 aabcd右旋乙個字元得到daabc aabcd右旋兩個字元得到cdaab 那麼今天就來說一下字串旋轉中的一些問題 首先說一下簡單的,先用函式...