LeetCode題解(0459):判斷字符串中是否有重複的子串(Python)

題目:原題鏈接(簡單)

題目標籤:

解法 時間複雜度 空間複雜度 執行用時
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章