【力扣周賽】第184 場 | 5380,5381,5382,5383

5380 數組中的字符串匹配

給你一個字符串數組 words ,數組中的每個字符串都可以看作是一個單詞。請你按 任意 順序返回 words 中是其他單詞的子字符串的所有單詞。

如果你可以刪除 words[j] 最左側和/或最右側的若干字符得到 word[i] ,那麼字符串 words[i] 就是 words[j] 的一個子字符串。

翻譯:輸出words中可以作爲words內元素子字符串的元素。

算法

class Solution(object):
    def stringMatching(self, words):
        """
        :type words: List[str]
        :rtype: List[str]
        """
        words.sort(key=len,reverse=True)
        k,res=[],[]
        for i in words:
            if not k:k.append(i)
            elif k:
                for j in k:
                    if i in j:
                        res.append(i)
                        break
                k.append(i)
        return res

5381 查詢帶鍵的排列

給你一個待查數組 queries ,數組中的元素爲 1 到 m 之間的正整數。 請你根據以下規則處理所有待查項 queries[i](從 i=0 到 i=queries.length-1):

一開始,排列 P=[1,2,3,…,m]。
對於當前的 i ,請你找出待查項 queries[i] 在排列 P 中的位置(下標從 0 開始),然後將其從原位置移動到排列 P 的起始位置(即下標爲 0 處)。注意, queries[i] 在 P 中的位置就是 queries[i] 的查詢結果。
請你以數組形式返回待查數組 queries 的查詢結果。

示例 1:
輸入:queries = [3,1,2,1], m = 5
輸出:[2,1,2,1]
解釋:待查數組 queries 處理如下:
對於 i=0: queries[i]=3, P=[1,2,3,4,5], 3 在 P 中的位置是 2,接着我們把 3 移動到 P 的起始位置,得到 P=[3,1,2,4,5] 。
對於 i=1: queries[i]=1, P=[3,1,2,4,5], 1 在 P 中的位置是 1,接着我們把 1 移動到 P 的起始位置,得到 P=[1,3,2,4,5] 。
對於 i=2: queries[i]=2, P=[1,3,2,4,5], 2 在 P 中的位置是 2,接着我們把 2 移動到 P 的起始位置,得到 P=[2,1,3,4,5] 。
對於 i=3: queries[i]=1, P=[2,1,3,4,5], 1 在 P 中的位置是 1,接着我們把 1 移動到 P 的起始位置,得到 P=[1,2,3,4,5] 。
因此,返回的結果數組爲 [2,1,2,1] 。

完全根據示例1寫算法

算法

class Solution(object):
    def processQueries(self, queries, m):
        """
        :type queries: List[int]
        :type m: int
        :rtype: List[int]
        """
        P=list(range(1,m+1))
        res=[]
        for i in queries:
            idx=P.index(i)
            res.append(idx)
            P.insert(0,P.pop(idx))
        return res

5382 HTML 實體解析器

「HTML 實體解析器」 是一種特殊的解析器,它將 HTML 代碼作爲輸入,並用字符本身替換掉所有這些特殊的字符實體。

HTML 裏這些特殊字符和它們對應的字符實體包括:

雙引號:字符實體爲 " ,對應的字符是 " 。
單引號:字符實體爲 ’ ,對應的字符是 ’ 。
與符號:字符實體爲 & ,對應對的字符是 & 。
大於號:字符實體爲 > ,對應的字符是 > 。
小於號:字符實體爲 < ,對應的字符是 < 。
斜線號:字符實體爲 ⁄ ,對應的字符是 / 。
給你輸入字符串 text ,請你實現一個 HTML 實體解析器,返回解析器解析後的結果。

算法

class Solution(object):
    def entityParser(self, text):
        """
        :type text: str
        :rtype: str
        """
        for i,j in [['&quot;','"'],['&apos;',"'"],['&gt;','>'],['&lt;','<'],['&frasl;','/'],['&amp;','&']]:
            text=text.replace(i,j)
        return text

這裏有一點就是字符串的方法一般都返回副本,而不是修改原字符串。

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

你有一個 n x 3 的網格圖 grid ,你需要用 紅,黃,綠 三種顏色之一給每一個格子上色,且確保相鄰格子顏色不同(也就是有相同水平邊或者垂直邊的格子顏色不同)。

給你網格圖的行數 n 。
請你返回給 grid 塗色的方案數。由於答案可能會非常大,請你返回答案對 10^9 + 7 取餘的結果。
在這裏插入圖片描述

吐了,先是用回溯做了這道題,寫完後看到n=5000我陷入了沉思……
我居然第一時間萌生了修改遞歸棧的深度……
然後醒悟這是道數學規律題……

input:1–out:12
input:2–out:54 6*(4+5)
input:3–out:246 6*(5*5+4*4)
……
……
……
我好恨/嚶嚶嚶,最後時間不夠,沒時間去好好思考規律所在。

在第一層可以擺出6個ABA類型的和6個ABC類型的塗法。對於下面每一層,每一個ABA塗法可以拼接2個ABC塗法和3個ABA塗法,每一個ABC塗法可以拼接2個ABC塗法和2個ABA塗法。這樣迭代可以算出第N層有幾種ABA塗法和ABC塗法,相加就是答案。

class Solution:
    def numOfWays(self, n):
        x, y = 6, 6
        for _ in range(n - 1):
            X, Y = x, y
            x = X * 3 + Y * 2
            y = X * 2 + y * 2
        return (x + y) % 1000000007

氣死ing。

保存一個周賽時寫的回溯算法

class Solution(object):
    def numOfWays(self, n):
        tp=[[None for i in range(3)]for j in range(n)]
        color=['red','yellow','green']
        res=0
        cc=set()
        def x(i,j):
            j += 1
            if j == 3:
                i += 1
                j = 0
            return i,j
        def rex(i,j):
            if j==0:
                i-=1
                j=2
            else:
                j-=1
            return i,j
        def h(n,i=0,j=0):
            nonlocal res
            if i==n and j==0:
                res+=1
                print(tp)
                return
            for k in color:
                if i == 0:
                    if j == 0 or 0 <= j - 1 < 3 and tp[i][j - 1] != k:
                        tp[i][j] = k
                        i,j=x(i,j)
                        h(n,i,j)
                        i,j=rex(i,j)
                elif j == 0:
                    if i == 0 or 0 <= i - 1 < n and tp[i - 1][j] != k:
                        tp[i][j] = k
                        i,j=x(i,j)
                        h(n,i,j)
                        i, j = rex(i, j)
                else:
                    if 0 <= i - 1 < n and tp[i-1][j] != k and 0 <= j - 1 < 3 and tp[i][j - 1] != k:
                        tp[i][j] = k
                        i,j=x(i,j)
                        h(n,i,j)
                        i, j = rex(i, j)
        h(n)
        return res
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章