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
實現結果
歡迎關注
公衆號 【書所集錄】