LeetCode 459. 重複的子字符串 | Python

459. 重複的子字符串


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

題目


給定一個非空的字符串,判斷它是否能夠由它的一個子串重複屢次構成。給定的字符串只含有小寫英文字母,而且長度不超過10000。bash

示例 1:.net

輸入: "abab"

輸出: True

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

示例 2:code

輸入: "aba"

輸出: False

示例 3:blog

輸入: "abcabcabcabc"

輸出: True

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

解題思路


思路:枚舉

先審題,題目中要求某個字符串是不是由某個子串重複屢次構成。leetcode

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

若是按照 sub_string 的長度去劃分 cur_string 字符串,這裏必定是可以完整劃分的,也就是說:get

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

以下列圖示:string

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

圖示 | 劃分

相隔長度 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

實現結果


實現結果

歡迎關注


公衆號 【書所集錄

相關文章
相關標籤/搜索