【Leetcode】括號類題總結

【leetcode20】有效的括號

題目:

給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。

有效字符串需滿足:

左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。

思路:整體思路用棧來做,左括號入棧,如果遇到匹配的右括號,出棧。

注意:hashmap.get的用法很好玩,返回鍵值,如果找不到鍵,返回None。

class Solution:
    def isValid(self, s: str) -> bool:
        hashmap = {")":"(", "]":"[", "}":"{"}
        stack = []
        for i in range(len(s)):
            #判斷是否是右括號,如果是,看是否與棧中是一對
            if stack and hashmap.get(s[i]) == stack[-1]:
                stack.pop()
            else:
                stack.append(s[i])
        if stack:
            return False
        return True

【leetcode22】括號的生成

給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。

例如,給出 n = 3,生成結果爲:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

思路:這道題暴力法可以是所有組合,然後判斷是否有效。對於這樣類似的全排列問題,回溯去重有個方法是剪枝,因爲想一下如何剪枝。三要素:

  1. 中斷條件:當所有括號都用完時記錄path,當左括號數 大於右括號數 中斷
  2. 路徑:path
  3. 選擇列表:左括號數和右括號數
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        #看到類似全排列的問題,想到回溯法
        #回溯法三要素:中斷條件;路徑;選擇列表;【剪枝】
        res = []
        def backtrack(path, left, right):
            if left == 0 and right == 0:
                res.append(copy.deepcopy(path))
                return
            if left < 0 or right < 0 or left > right:
                return
            backtrack(path + "(", left - 1, right)
            backtrack(path + ")", left, right - 1)
        backtrack('', n, n)
        return res

【leetcode1111】有效括號的嵌套深度

有效括號字符串 定義:對於每個左括號,都能找到與之對應的右括號,反之亦然。詳情參見題末「有效括號字符串」部分。

嵌套深度 depth 定義:即有效括號字符串嵌套的層數,depth(A) 表示有效括號字符串 A 的嵌套深度。詳情參見題末「嵌套深度」部分。

有效括號字符串類型與對應的嵌套深度計算方法如下圖所示:

給你一個「有效括號字符串」 seq,請你將其分成兩個不相交的有效括號字符串,A 和 B,並使這兩個字符串的深度最小。

不相交:每個 seq[i] 只能分給 A 和 B 二者中的一個,不能既屬於 A 也屬於 B 。
A 或 B 中的元素在原字符串中可以不連續。
A.length + B.length = seq.length
深度最小:max(depth(A), depth(B)) 的可能取值最小。 
劃分方案用一個長度爲 seq.length 的答案數組 answer 表示,編碼規則如下:

answer[i] = 0,seq[i] 分給 A 。
answer[i] = 1,seq[i] 分給 B 。
如果存在多個滿足要求的答案,只需返回其中任意 一個 即可。

代碼及思路如下:

#先判斷是否是有效括號字符串:題目中已經說了是有效字符串了
#對於"()(())()",如果前後相同分到不同組,前後不同分到同一組
class Solution:
    def maxDepthAfterSplit(self, seq: str) -> List[int]:
        res = [0 for _ in range(len(seq))]
        for i in range(1, len(seq)):
            if seq[i] == seq[i - 1]:
                res[i] = 1 - res[i - 1]
            if seq[i] != seq[i - 1]:
                res[i] = res[i - 1]
        return res

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章