(力扣每日一題)重複的子字串

2021-10-23 18:28:01 字數 2461 閱讀 9662

給定乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。給定的字串只含有小寫英文本母,並且長度不超過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 中選出 最大 的字元,將它 接在 結果字串的...