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

2021-09-02 02:59:27 字數 1382 閱讀 3058

【題目】

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

【分析】

【思路一】

從題目中可以看出,我們可以使用最直接的方法對s1進行迴圈移動,再進行字串包含的判斷,從而遍歷其所有的可能性。

字串迴圈移動,時間複雜度為o(n),字串包含判斷,採用普通的方法,時間複雜度為o(n*m),總體複雜度為o(n*n*m)。

字串包含判斷,若採用kmp演算法,時間複雜度為o(n),這樣總體的複雜度為o(n*n)。若字串的長度n較大,顯然效率比較低。其中n為s1的長度,m為s2的長度。

【思路二】

我們也可以對迴圈移位之後的結果進行分析。

以s1 = abcd為例,先分析對s1進行迴圈移位之後的結果,如下所示:

abcd--->bcda---->cdab---->dabc---->abcd……

假設我們把前面的移走的資料進行保留,會發現有如下的規律:

abcd--->abcda---->abcdab---->abcdabc---->abcdabcd……

因此,可以看出對s1做迴圈移位所得到的字串都將是字串s1s1的子字串。如果s2可以由s1迴圈移位得到,那麼s2一定在s1s1上,這樣時間複雜度就降低了。

【**一】

/*********************************

* 日期:2014-5-15

* 題號: 字串移位包含問題

**********************************/

#include #include #include using namespace std;

bool isrotate(char* str1,char* str2)

int len = strlen(str1);

//迴圈移位

for(i = 0;i < len;i++)

str1[len-1] = temp;

//判斷str1中是否包含str2

if(strstr(str1,str2) != 0)

}return false;

}int main()

int len1 = strlen(str1);

char* str3 = new char(len1*2+1);

strcpy(str3,str1);

strcat(str3,str1);

//str3 = str1+str1

if(strstr(str3,str2) != 0)

return false;

}int main()

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

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

字串移位包含問題 程式設計之美 3 1

題目 給定兩個字串s1和s2,要求判定s2是否能夠被s1做迴圈移位得到的字串包含。例如 給定s1 aabcd和s2 cdaa,返回true 給定 s1 abcd和s2 abcd,返回false。1.思路 將字串s1迴圈左移且每次移動一位,得到乙個新的字串,然後比較s2是否被s1所包含,包含則返回tr...

程式設計之美3 1 字串移位包含問題

程式設計之美3.1 字串移位包含問題。判斷s2能否被s1做迴圈移位得到的字串包含,若直接判斷效率較低。可以將s1s1連線起來,如果s2可以通過迴圈移位得到,則s2一定是s1s1的子串,可以通過呼叫strstr得到。時間複雜度o n m 不過strstr的實現效率較低,可以使用kmp判斷是否是子串。每...