有一道關於字串旋轉的題比較有意思,拿來和大家分享一下,題目是這樣的:實現乙個函式,可以左旋字串中的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 那麼今天就來說一下字串旋轉中的一些問題 首先說一下簡單的,先用函式...