題目描述:給定乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。給定的字串只含有小寫英文本母,並且長度不超過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 解釋...