1. 程式人生 > 實用技巧 >LeetCode 459. 重複的子字串 | Python

LeetCode 459. 重複的子字串 | Python

459. 重複的子字串


題目來源:力扣(LeetCode)https://leetcode-cn.com/problems/repeated-substring-pattern

題目


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

示例 1:

輸入: "abab"

輸出: True

解釋: 可由子字串 "ab" 重複兩次構成。

示例 2:

輸入: "aba"

輸出: False

示例 3:

輸入: "abcabcabcabc"

輸出: True

解釋: 可由子字串 "abc" 重複四次構成。 (或者子字串 "abcabc" 重複兩次構成。)

解題思路


思路:列舉

先審題,題目中要求某個字串是否是由某個子串重複多次構成。

這裡我們假設字串 cur_string 是由某個子串 sub_string 重複多次構成。結合示例,嘗試分析裡面的規律。

如果按照 sub_string 的長度去劃分 cur_string 字串,這裡一定是能夠完整劃分的,也就是說:

  • sub_string 的長度是 cur_string 長度的倍數;
  • 同樣的,每個劃分部分的子串都是同樣的。令 m = len(sub_string),也就說相隔長度 m,前後兩個子串對應的字元是相同的。(後續子串部分同樣成立)

如下列圖示:

以子串的長度劃分給定字串

相隔長度 m(子串長度),對應的字元相同

但是這裡需要注意,這裡重複次數至少有 1 次,那麼子串的長度不會大於給定字串長度的一半。那麼我們列舉的時候,只要在 [1, n/2] (n:給定字串的長度)的範圍內檢查是否有符合條件的情況。

那麼,根據上面的分析,現在我們說下列舉的具體方法(下面部分 n 表示給定字串的長度):

  • [1, n/2] 開始遍歷,先查詢能被 n 整除的數字 i;
  • 當找到 i 時, i 也就是此時子串的長度。此時判斷子串是否能重複多次構成給定的字串。從 [i, n] 開始判斷,根據前面分析的情況二,相隔長度 i(子串長度),對應的字元是相同的。

具體程式碼實現如下。

程式碼實現


class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        n = len(s)

        # 子串至少重複一次
        for i in range(1, n//2+1):
            if n % i == 0:
                if all(s[j]==s[j-i] for j in range(i, n)):
                    return True
        
        return False

實現結果


歡迎關注


公眾號 【書所集錄