459 重複的子字串

2021-10-10 21:09:10 字數 3046 閱讀 8987

題目描述:給定乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。給定的字串只含有小寫英文本母,並且長度不超過10000。

解題思路一:迴圈遍歷可以重複的長度,依次比較每個重複長度中對應的字元是否相等,只要可以成功匹配並遍歷完整個陣列,即返回true,否則返回false,**如下:

class

solution

:def

repeatedsubstringpattern

(self, s:

str)

->

bool

: size =

len(s)

if size ==1:

return

false

for i in

range(1

, size //2+

1):if size % i ==0:

c = size // i

k = c

for j in

range

(i, size)

:if s[j]

!= s[j-i]

:break

else

:return

true

return

false

解題思路二:將兩個s拼湊在一起並去除首字母和最後乙個字母之後,s仍是拼湊字串的子串,那麼s就是滿足要求的,詳細證明見證明,**如下:

class

solution

:def

repeatedsubstringpattern

(self, s:

str)

->

bool

:return

(s+s)

.find(s,1)

!=len

(s)

解題思路三:方法和二一樣,不用庫函式,直接用kmp演算法實現,**如下:

class

solution

:def

repeatedsubstringpattern

(self, s:

str)

->

bool

:def

buildnext

(p):

size =

len(p)

n =[-

1]* size

t =-1

j =0while

(j < size -1)

:if(t <

0or p[j]

== p[t]):

j +=

1 t +=

1 n[j]

= t if p[j]

!= p[t]

else n[t]

else

: t = n[t]

return n

defkmp(s, p)

: n, m =

len(s)

,len

(p) i, j =0,

0 next_t = buildnext(p)

while

(i < n and j < m):if

(j <

0or s[i]

== p[j]):

i +=

1 j +=

1else

: j = next_t[j]

return

(i - j)

<=

(n - m)

return kmp(

(s+s)[1

:-1]

, s)

解題思路四:優化kmp演算法,因為kmp演算法中構造的next表,n[j]的值等於s[:j]中字首等於字尾的子串的最大長度,因此我們可以直接觀察next表的最後乙個值,對於滿足題目要求的字串s來說,len(s)-n[-1]-1應該就是重複子串 t′t'

t′的長度,只要len(t')len(s)的約數就可以了,另外還要滿足s[-1]=s[n[-1]],因為這裡的next表不只是用來做字元匹配,而是有實際的意義,因此這裡就不能做像思路三種優化措施,**如下:

class

solution

:def

repeatedsubstringpattern

(self, s:

str)

->

bool

:def

buildnext

(p):

size =

len(p)

n =[-

1]* size

t =-1

j =0while

(j < size -1)

:if(t <

0or p[j]

== p[t]):

j +=

1 t +=

1 n[j]

= t # n[j] = t if p[j] != p[t] else n[t]

else

: t = n[t]

return n

n = buildnext(s)

size =

len(s)

return n[-1

]!=-1

and s[n[-1

]]== s[-1

]and

(size %

(size -

1- n[-1

])==0

)

459 重複的子字串

給定乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。給定的字串只含有小寫英文本母,並且長度不超過10000。示例 1 輸入 abab 輸出 true 解釋 可由子字串 ab 重複兩次構成。示例 2 輸入 aba 輸出 false 示例 3 輸入 abcabcabcabc 輸出 true 解...

459 重複的子字串

難度 簡單 2020 8 24每日一題打卡 題目描述 解題思路 想法很巧妙啊,大概是這輩子我也想不出來的方法哈哈哈 比如說abcabc,兩個拼一起就是 a bcabcabcab c 去掉首尾兩個字元,實際上就是破除了迴圈 看剩下的字元中是否包含原來的子串,如果包含則說明存在迴圈,如果不包含則不存在 ...

459 重複的子字串

給定乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。給定的字串只含有小寫英文本母,並且長度不超過10000。示例 1 輸入 abab 輸出 true 解釋 可由子字串 ab 重複兩次構成。示例 2 輸入 aba 輸出 false示例 3 輸入 abcabcabcabc 輸出 true 解釋...