leetcode 周賽 184 - python 解答

5380.數組中的字符串匹配

暴力二重循環,由於 words 長度小於 100,確定不會超時,可是注意每次找到了子串要 break,不然可能有重複。html

class Solution:
    def stringMatching(self, words: List[str]) -> List[str]:
        ans = []
        for i in range(len(words)):
            for j in range(len(words)):
                if i == j: continue
                if words[i] in words[j]:
                    ans.append(words[i])
                    break
        return ans

5381.查詢帶鍵的排列

這題沒有想到好的解法,直接寫了最普通的模擬,本地試了下,還挺快的,應該會有更好的辦法吧。python

class Solution:
    def processQueries(self, queries: List[int], m: int) -> List[int]:
        m = min(m, max(queries))
        p = [i+1 for i in range(m)]
        ans = []
        for x in queries:
            i = p.index(x)
            ans.append(i)
            x = p.pop(i)
            p.insert(0, x)
        return ans

5382.HTML 實體解析器

這題對於 python 來講形同虛設。我直接用了替換函數,注意 python 的字符串是不可變類型,每次生成新對象。數組

class Solution:
    def entityParser(self, text: str) -> str:
        text = text.replace('"', '"')
        text = text.replace(''', '\'')
        text = text.replace('&', '&')
        text = text.replace('>', '>')
        text = text.replace('&lt;', '<')
        text = text.replace('&frasl;', '/')
        return text

感謝評論去兩位同窗指正,這個代碼若是 遇到 &amp;gt; 輸出的結果是 > ,可是這個其實是把 &amp; 轉義出的 &gt; 組合了,因此代碼能夠把 text = text.replace('&amp;', '&') 放到最後一句以來避免,代碼以下:app

class Solution:
    def entityParser(self, text: str) -> str:
        text = text.replace('&quot;', '"')
        text = text.replace('&apos;', '\'')
        text = text.replace('&amp;', '&')
        text = text.replace('&gt;', '>')
        text = text.replace('&lt;', '<')
        text = text.replace('&frasl;', '/')
        return text

可是我又發現,判題系統目前對 &amp;gt; 的輸出其實是 >
那麼再試下 "&amp;gt;" 輸出是 "&amp;gt;",又沒有遞歸處理,看了是判題機有問題。
image.png
image.png函數

5383.給 N x 3 網格圖塗色的方案數

有一個很相似的題目,就是 一個 n 位的數組,每一個位置能夠填 0,1,2,可是相鄰的不能重複,求一共有多少中填法。(好像還有點別的附加條件)spa

這道題目三種顏色沒有任何區別,就用 ABC 來表明,n = 1 時
A 開頭有:
ABA ABC ACA ACB
B 開頭有:
BAB BAC BCA BCB
C 開頭有:
CAB CAC CBA CBCcode

這裏總結起來只有兩種模式:ABA 即第一第三個同樣 和 ABC 即三個都不一樣。htm

ABA 模式有 6 種:ABA ACA BAB BCB CAC CBC
ABC 模式有 6 種:ABC ACB BAC BCA CAB CBA對象

第二層須要再第一層的基礎上安排,並且只和他的模式有關,而與具體顏色無關。blog

若是第一層是 ABA 模式(這個模式裏的任意狀況都會形成相同的結果):

第一層   ABA   ABA   ABA   ABA   ABA
         |||   |||   |||   |||   |||
第二層   BAB   BAC   BCB   CAC   CAB

結果有 5 種,一樣,咱們只看模式,不看具體顏色,結果種有 ABA 模式 3 種,ABC 模式 2 種

若是第一層是 ABC 模式(這個模式裏的任意狀況都會形成相同的結果):

第一層   ABC   ABC   ABC   ABC
         |||   |||   |||   |||
第二層   BAB   BCA   BCB   CAB

結果有 4 種,一樣,咱們只看模式,不看具體顏色,結果種有 ABA 模式 2 種,ABC 模式 2 種

咱們代碼裏用 aba 表示當前層的 ABA 模式種數,abc 表示當前層 ABC 模式種數,而 aba2,abc2 表示下一層。這樣就能夠地推計算種類數量:

MOD = 1000000007
aba2 = (aba * 3 + abc * 2) % MOD
abc2 = (aba * 2 + abc * 2) % MOD

aba 和 abc 初始都爲 6

class Solution:
    def numOfWays(self, n: int) -> int:
        aba = 6
        abc = 6
        MOD = 1000000007
        for _ in range(n-1):
            aba2 = (aba * 3 + abc * 2) % MOD
            abc2 = (aba * 2 + abc * 2) % MOD
            aba, abc = aba2, abc2
        return (aba + abc) % MOD

歡迎來個人博客: https://codeplot.top/
個人博客刷題分類:https://codeplot.top/categories/%E5%88%B7%E9%A2%98/

相關文章
相關標籤/搜索