給定兩個字串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 ? 1is efb in abcdef ? 0
程式設計之美 2 17 字串迴圈移位
將字串向右迴圈移動 k 位 s abcd123 k 3 return 123abcd 將子串 s 0 str.length k 翻轉,子串s str.length k,str.length 翻轉。然後將整個字元翻轉可以到最終結果。eg 將 abcd123 中的 abcd 和 123 單獨翻轉,得到 ...
字串迴圈移位 程式設計之美3 1
給定兩個字串s1和s2,要求判定s2能否能被s1做迴圈移位得到的字串包含。例如,s1 aabcd,s2 cdaa,返回true,給定s1 abcd,s2 acbd,返回false。思路1 找出所有迴圈移位,逐個進行字串匹配。n 字串匹配的複雜度。kmp可以做到線性,因此總的複雜度為n 2.思路2 s...
程式設計之美3 1 字串移位包含問題
程式設計之美3.1 字串移位包含問題。判斷s2能否被s1做迴圈移位得到的字串包含,若直接判斷效率較低。可以將s1s1連線起來,如果s2可以通過迴圈移位得到,則s2一定是s1s1的子串,可以通過呼叫strstr得到。時間複雜度o n m 不過strstr的實現效率較低,可以使用kmp判斷是否是子串。每...