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

2021-06-22 23:59:20 字數 826 閱讀 6879

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

思路1:找出所有迴圈移位,逐個進行字串匹配。n*字串匹配的複雜度。kmp可以做到線性,因此總的複雜度為n^2.

思路2:s1複製一下,變成s1s1,如s1=abcd,變成abcdabcd,用它進行匹配。那樣就是2n的字串匹配。不過要浪費n的空間。

思路3:還是按原來一樣做字串匹配,只不過匹配串的尾端允許超出源字串範圍(開頭不能超過),用%對下標求餘。空間o(1),時間o(n)。

思路3**:

[cpp]view plain

copy

#include

// 迴圈移位字串的包含問題,程式設計之美3.1

//int

findstr(

const

char

*s1, 

const

char

*s2)  

p=s2;  

while

(*p != 

'\0'

)    

while

(i < m1 && j < m2)  

}  if(j == m2)  

return

1;  

return

0;  

}  int

main()    

輸出:

is efab in abcdef ? 1

is efb in abcdef ? 0

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

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

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

這道題目的意思是給定乙個字串,作為源字串,之後給出其他的字串,確定源字串是否能夠經過旋轉而得到給定的字串,即移位包含問題。假如,給定乙個字串 abcdefg,接著給定字串 cdefgab,很顯然,給定的字串是可以經過源字串旋轉而得到的,但是,給定字串 cdegfab 就不能由源字串經過旋轉而得到。當...

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

這道題目的意思是給定乙個字串,作為源字串,之後給出其他的字串,確定源字串是否能夠經過旋轉而得到給定的字串,即移位包含問題。假如,給定乙個字串 abcdefg,接著給定字串 cdefgab,很顯然,給定的字串是可以經過源字串旋轉而得到的,但是,給定字串 cdegfab 就不能由源字串經過旋轉而得到。當...