日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法(25)-括号

發布時間:2023/12/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法(25)-括号 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

各種括號

  • 1.LeetCode-22 括號生成--各種括號排列組合
  • 2.LeetCode-20 有效括號(是否)--堆棧
  • 3.LeetCode-32 最長有效括號(長度)--dp
  • 4.LeetCode-301刪除無效括號 --多種刪除方式

1.LeetCode-22 括號生成–各種括號排列組合

數字 n 代表生成括號的對數,請你設計一個函數,用于能夠生成所有可能的并且 有效的 括號組合。

輸入:n = 3 輸出:["((()))","(()())","(())()","()(())","()()()"]

回溯法

def generateParenthesis(self, n):res = []def back_track(s,left,right):if len(s) == 2*n:res.append(s)return if left < n:back_track(s+"(",left+1,right)if right< left: # 保證不會生成不合理的括號 ,必須要有配對的左括號已經存在back_track(s+")",left,right+1)back_track("",0,0)return res

2.LeetCode-20 有效括號(是否)–堆棧

給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。
注意空字符串可被認為是有效字符串。

輸入: "()[]{}" 輸出: true

機理:合理的右括號,總能找到對應的左括號。多出左括號或者右括號都是不對的。多對括號復合,拿掉一對合理的括號,并不改變括號復合的合理性。

堆棧:棧頂匹配。左括號入棧,配對右括號,彈出對應的左括號;不配對右括號,入棧。遍歷完字符串,查看棧是否為空,空則有效,非空,無效。

def isValid(self, s):dit={")":"(","]":"[","}":"{"}stack=[]for char in s:if char in dit: # char為右括號left=stack.pop() if stack else "#"if dit[char]!=left:return Falseelse: # char 為左括號入棧stack.append(char)return True if len(stack) == 0 else False

多括號行為,單括號可以直接用計數法

3.LeetCode-32 最長有效括號(長度)–dp

給定一個只包含 ‘(’ 和 ‘)’ 的字符串,找出最長的包含有效括號的子串的長度。

輸入: "(()" 輸出: 2 解釋: 最長有效括號子串為 "()"

dp[i] 表示以下標 i字符結尾的最長有效括號的長度,(以s[i]結尾能構成的有效字符串的長度)依據s[i] 與之前的括號的配對情況,更行dp數組。
顯然有效的子串一定以)結尾,因此我們可以知道以(結尾的子串對應的dp 值必定為 0,我們只需要求解 )在dp 數組中對應位置的值。

# 1.s[i]==")" and s[i-1]=="(" dp[i] = dp[i-2]+2 # 2.s[i]==")" and s[i-1]==")" dp[i] = dp[i-1] + dp[i-dp[i-1]-2]+2 下標的合理性 def longestValidParentheses(self, s):n=len(s)if n<2:return 0dp=[0]*nres=0for i in range(1,n):if i==1:if s[i]==")" and s[i-1]=="(":dp[1]=2else:if s[i]==")" and s[i-1]=="(":dp[i]=dp[i-2]+2 if s[i]==")" and s[i-1]==")":if i-1-dp[i-1]>=0 and s[i-1-dp[i-1]]=="(":dp[i]=dp[i-1]+2 # index 有效性沒有驗證if i-2-dp[i-1]>=0:dp[i]+=dp[i-2-dp[i-1]]res=max(res,dp[i]) return res

4.LeetCode-301刪除無效括號 --多種刪除方式

刪除最小數量的無效括號,使得輸入的字符串有效,返回所有可能的結果。
說明: 輸入可能包含了除 ( 和 ) 以外的字符。

輸入: "()())()" 輸出: ["()()()", "(())()"]

考慮所有的刪除情況,采用廣度優先,第一層為原字符串表達式,第二層為刪除一個字符,第三層為刪除兩個字符的情況,不斷廣度優先遍歷,直至找到第一個有效的刪除數量,即為最少數量

DFS:要求刪除的括號最少,每次刪除一個,觀察刪除后的字符串是否合法,如果已經合法,不用繼續刪除。
BFS:本層level和下一層level 之間的關系:本層level每個元素都拿出來,列舉刪除一個括號后的所有可能,添加到下一層level 中。

解決重復性問題:吧level 中的list換成set
檢查括號是否合法:堆棧法
用filter(func, param) 可以得到param中所有符合條件的元素。

class Solution(object):def removeInvalidParentheses(self, s):""":type s: str:rtype: List[str]"""def is_valid(string):count = 0for char in string:if char == "(":count += 1elif char == ")":count -= 1if count < 0: # 中途中計數器如果小于0說明,不明多余右括號出現return Falsereturn count == 0# BFSlevel = {s} # 用set避免重復while True:valid = list(filter(isValid, level)) # 判斷同一層的所有刪除結果時候存在有效備選if valid: return valid # 下一層levelnext_level = set()for item in level:for i in range(len(item)):if item[i] in "()": # 如果item[i]這個char是個括號就刪了,如果不是括號就留著next_level.add(item[:i]+item[i+1:])level = next_level

總結

以上是生活随笔為你收集整理的算法(25)-括号的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。