字串的移位包含問題

2021-08-15 00:03:23 字數 1378 閱讀 7775

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

迴圈移位:即對於乙個長度為n的字串陣列,把下標為0的字元放到下標為1的字元的位置,把下標為1的字元放到下標為2的字元的位置,……把下標為n-2的字元放到下標為n-1的字元的位置,把下標為n-1的字元放到下標為0的字元的位置,即完成一次迴圈移位。

最直接的方法就是對s1進行迴圈移位,如果字串的長度為n,那麼久迴圈移位n次,在每一次的迴圈移位中進行字串的包含判斷。按照這個思路就可以有下面的**:

bool iscontain(char *s1, char *s2) 

s1[len - 1] = tem;

if(strstr(s1, s2) != null)

}return

false;

}

演算法分析:

演算法的複雜度取決於字串的長度n,如果字串的長度很大的時候,這個演算法的效率就很低了。

在程式設計之美給出另一種方法

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

假如字串s1 = abcd,對字串的迴圈移位過程如下:

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

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

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

因此可以發現,對s字串進行迴圈移位過程中產生的字串都是字串s1s1 的子字串,假如 s2 可以由s1 迴圈移位得到的話,那麼s2 就一定是字串s1s1 的字串,因此這樣問題就轉變了:

bool iscontain(char *s1, char *s2) 

} if(strstr(s, s2) != null) else

}

演算法分析:

這樣一來,時間複雜度就大大降低了;但是我們也不難發現,這種演算法就是一種典型的「提高空間複雜度來換取時間複雜度的降低」的方法,所以說還是沒有一種絕對高效的方法,具體採用哪一種方法還是看具體的要求吧。

strstr函式說明:

原型:extern

char *strstr(char* haystack, char* needle);

用法:#include

功能: 從字串haystack中尋找needle第一次出現的位置,如果沒有找到則返回null;

程式設計之美—第三章 結構之美 3.1 字串的移位包含問題

字串移位包含問題

問題描述 給定兩個字串s1和s2,要求判定s2是否能夠被s1做迴圈移動得到的字串包含。如s1 aabcd和s2 cdaa,則s1迴圈移動後包含s2,返回true s1 abcd和s2 acbd,則s1迴圈移動後不包含s2,返回false 解題思路 1 可以發現,s1迴圈移動後的結果肯定包含在字串s1...

字串移位包含問題

本問題 於 程式設計之美 問題描述 給定兩個字串s1和s2,要求判定s2是否能夠被通過s1做迴圈移位 rotate 得到的字串包含。例如,給定s1 aabcd和s2 cdaa,返回true 給定s1 abcd和s2 acbd,返回false。下面有兩種解法,第一種是列舉法 第二種是用了一種技巧,實現...

字串移位包含的問題

字串移位包含的問題 給定兩個字串s1和s2,要求判斷s2是否能夠被s1做迴圈移位得到的字串包含,例如,給定s1 aabcd和s2 cdaa,返回true 給定s1 abcd和s2 acbd,返回false 在做這道題的時候我發現了乙個很容易出錯,但是去不容易找到原因。主要原因是我們對於全變數初始化位...