給定乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。給定的字串只含有小寫英文本母,並且長度不超過10000。
解題思路
方法一 列舉法
1、如果乙個長度為 n 的字串 s可以由它的乙個長度為 n』的子串 s』重複多次構成,那麼:
n 一定是 n』 的倍數;s ′ 一定是 s 的字首;
2、對於任意的i∈[n ′,n),有s[i]=s[i−n′]。
也就是說,s 中長度為 n』 的字首就是 s』,並且在這之後的每乙個位置上的字元 s[i],都需要與它之前的第 n』個字元 s[i−n′] 相同。
3、因此,我們可以從小到大列舉 n』,並對字串 s進行遍歷,進行上述的判斷。
**
class
solution
:def
repeatedsubstringpattern
(self, s:
str)
->
bool
: n =
len(s)
for i in
range(1
, n //2+
1):if n % i ==0:
#對於任意的 i∈[n ′,n),有 s[i]=s[i−n′]。
ifall
(s[j]
== s[j - i]
for j in
range
(i, n)):
return
true
return
false
時間複雜度:o(n^2),其中 n是字串 s 的長度。
空間複雜度:o(1)。
方法二 字串匹配
(s)方法三 (kmp演算法)(困難)kmp演算法學習參考:
class
solution
:def
repeatedsubstringpattern
(self, s:
str)
->
bool
:def
kmp(query:
str, pattern:
str)
->
bool
: n, m =
len(query)
,len
(pattern)
fail =[-
1]* m for i in
range(1
, m)
: j = fail[i -1]
while j !=-1
and pattern[j +1]
!= pattern[i]
: j = fail[j]
if pattern[j +1]
== pattern[i]
: fail[i]
= j +
1 match =-1
for i in
range(1
, n -1)
:while match !=-1
and pattern[match +1]
!= query[i]
: match = fail[match]
if pattern[match +1]
== query[i]
: match +=
1if match == m -1:
return
true
return
false
return kmp(s + s, s)
時間複雜度:o(n),其中 n 是字串 s 的長度。
空間複雜度:o(n)。
力扣 每日一題 151 翻轉字串
翻轉字串裡的單詞 給定乙個字串,逐個翻轉字串中的每個單詞。示例 1 輸入 the sky is blue 輸出 blue is sky the 示例 2 輸入 hello world 輸出 world hello 解釋 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。示例 3 輸...
leetcode每日一題 重複的子字串
給定乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。給定的字串只含有小寫英文本母,並且長度不超過10000。示例 1 輸入 abab 輸出 true 解釋 可由子字串 ab 重複兩次構成。示例 2 輸入 aba 輸出 false示例 3 輸入 abcabcabcabc 輸出 true 解釋...
力扣 1370 上公升下降字串 (每日一題)
給你乙個字串 s 請你根據下面的演算法重新構造字串 從 s 中選出 最小 的字元,將它 接在 結果字串的後面。從 s 剩餘字元中選出 最小 的字元,且該字元比上乙個新增的字元大,將它 接在 結果字串後面。重複步驟 2 直到你沒法從 s 中選擇字元。從 s 中選出 最大 的字元,將它 接在 結果字串的...