程式設計之美 字串移位包含的問題(續)

2021-09-06 10:08:22 字數 1560 閱讀 7960

問題描述

給定兩個字串s1和s2,要求判定s2是否能被s1迴圈移位(rotate)得到的字串包含。例如,給定字串s1=aabcd和s2=cdaa,返回true;給定s1=abcd和s2=acbd返回false。

對問題的兩種分析,詳見:

思路一是暴力演算法,窮舉所有最後還不一定找到。

思路二使用空間換取時間,是一種很好的思路。下面給出另外兩個思路:

思路三思路二的優化。增加和源字串產度相同的空間,其實在大部分情況下造成浪費,可以根據待查字串動態分配指定的空間。如圖:

結果:0123450123

yes!

思路四

首先看個子問題:

問題描述平移abc123,是結果為123abc

可以注意旋轉平移——浪費時間

可以用備用陣列暫存——浪費空間

優化:翻轉函式rev(),例如:rev(abc) = cba;

那麼rev(abc123) = rev(rev(abc)rev(123)) = rev(cba321)= 123abc

對於原始字串abcdef,旋轉後,觀察規律(如下),可以看出如果

fabcde

efabcd

defabc

cdefab

bcdefa

可以看出首尾字元起決定作用,可以根據待查字串找出旋轉元素的個數,然後旋轉源字串,判斷待查字串是否在源字串中。如圖:

注意其中有詐,有可能之前找到的並不是首尾字串而是其中的一部分。

} printf(

"no, it's not a part\n");

return0;

}結果:yes, it is a part

程式設計之美 字串移位包含的問題(續)

問題描述 給定兩個字串s1和s2,要求判定s2是否能被s1迴圈移位 rotate 得到的字串包含。例如,給定字串s1 aabcd和s2 cdaa,返回true 給定s1 abcd和s2 acbd返回false。對問題的兩種分析,詳見 思路一是暴力演算法,窮舉所有最後還不一定找到。思路二使用空間換取時...

程式設計之美 字串移位包含

問題描述 兩個字串s1,s2,將s1迴圈位移,判斷s2是否被包含在其中。例如 s1 abcd s2 cda 將s1迴圈位移後得到bcda,s2被包含在s1迴圈位移後的字串中。思路 1 將s1移位一次,然後與s2比較一次。如果字串比較長,效率很低。思路 2 假設保留s1移位的結果,例如 s1 abcd...

字串移位包含的問題(程式設計之美)

分類 程式語言 c 2012 06 26 19 38 210人閱讀收藏 舉報程式設計演算法 字串移位包含的問題 程式設計之美 p221 223 問題 給定兩個字串s1和s2,要求判斷s2是否能夠被通過s1做迴圈移位 rotate 得到的字串包含。例如,s1 aabcd和s2 cdaa,返回true ...