題目:原題鏈接(簡單)
題目標籤:
解法 | 時間複雜度 | 空間複雜度 | 執行用時 |
---|---|---|---|
Ans 1 (Python) | O(n^2) | O(1) | 72ms (50.99%) |
Ans 2 (Python) | O(n) | O(1) | 40ms (92.28%) |
Ans 3 (Python) | O(n) | O(n) | 256ms (13.03%) |
LeetCode的Python執行用時隨緣,只要時間複雜度沒有明顯差異,執行用時一般都在同一個量級,僅作參考意義。
解法一:
def repeatedSubstringPattern(self, s: str) -> bool:
size = len(s)
for i in range(1, size):
# 若不是子串長度的整倍數則一定不是該長度子串的多次構成
if size % i != 0:
continue
# 比較各部分子串是否相同
differ = False
pattern = s[:i]
for j in range(1, size // i):
sample = s[j * i:(j + 1) * i]
if pattern != sample:
differ = True
break
if not differ:
return True
else:
return False
解法二(解法一的優化):
def repeatedSubstringPattern(self, s: str) -> bool:
size = len(s)
for i in range(1, size // 2 + 1):
# 若不是子串長度的整倍數則一定不是該長度子串的多次構成
if size % i != 0:
continue
# 比較各部分子串是否相同
if (s[:i] * (size // i)) == s:
return True
else:
return False
解法三(KMP):
def repeatedSubstringPattern(self, s: str) -> bool:
size = len(s)
next = [-1] * size
for i in range(1, size):
j = next[i - 1]
while j >= 0 and s[j + 1] != s[i]:
j = next[j]
if s[j + 1] == s[i]:
next[i] = j + 1
print(next)
return next[-1] >= 0 and size % (size - 1 - next[-1]) == 0