iT邦幫忙

0

leetcode with python:459. Repeated Substring Pattern

  • 分享至 

  • xImage
  •  

題目:

Given a string s, check if it can be constructed by taking a substring of it and appending multiple copies of the substring together.

給定一字串,判斷其是否由一重複字串組成
ex:input:"abab"=>output:True
explanation: It is the substring "ab" twice.

我採取我當下最直觀的作法

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        for i in range(1,len(s)//2+1):
            if len(s)%i:
                continue
                
            if s[:i]*(len(s)//i)==s:
                return True
            
        return False

若該字串符合題目條件
則從第一項開始的長度為1~(len(s)//2+1)的子字串中(重複字串長度不可能超過原字串的一半)
其中有一個就是題目要的重複字串

於是我們將其一個一個拿出來驗證
先看子字串長度能否整除原字串
因為能整除原字串該子字串才有可能是組成原字串的重複字串

接著看將該子字串重複至和原字串一樣長看兩者是否相等
若相等直接回傳True,反之則繼續看下個可能
如果這些可能都不符合期待的話,回傳False
最後執行時間51ms(faster than 84.36%)

另一個解法是在討論區看到的
我認為十分巧妙,所以特別分享一下

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        return s in s[1:]+s[:-1]

將一個s去頭,一個s去尾,兩者結合
若該新字串中存在s,則s為一重複字串組成

這解法似乎還有證明,我大概用實例講一下
假設一字串a,而aa就是符合題目期待的字串模式
我們將兩aa相連去頭去尾,假設a去頭為b,去尾為c
則新字串變為baac,可以發現aa存在於其中
這方法套用在驗證其他形式的以重複字串組成字串也一樣行得通
最後執行時間35ms(faster than 97.55%)

那我們下題見


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言