算法(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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444959.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444959.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444959.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(二十)深入淺出TCPIP之epoll的一些思考

Epoll基本介紹 在linux的網絡編程中,很長的時間都在使用select來做事件觸發。在linux新的內核中,有了一種替換它的機制,就是epoll。相比于 select,epoll最大的好處在于它不會隨著監聽fd數目的增長而降低效率。因為在內核中的select實現中,它是采用輪詢來處理的,輪詢的fd…

leetcode542 01矩陣

給定一個由 0 和 1 組成的矩陣&#xff0c;找出每個元素到最近的 0 的距離。 兩個相鄰元素間的距離為 1 。 示例 1: 輸入: 0 0 0 0 1 0 0 0 0 輸出: 0 0 0 0 1 0 0 0 0 示例 2: 輸入: 0 0 0 0 1 0 1 1 1 輸出: 0 0 0 0 1 0 1 2 1 注意: 給定矩陣的元素個數不超過 10000。…

RPC、RMI與MOM與組播 通信原理 .

遠程過程調用&#xff08;RPC&#xff09;&#xff1a; 即對遠程站點機上的過程進行調用。當站點機A上的一個進程調用另一個站點機上的過程時&#xff0c;A上的調用進程掛起&#xff0c;B上的被調用過程執行&#xff0c;并將結果返回給調用進程&#xff0c;使調用進程繼續執行【…

網關服務器 .

之前想著要把什么什么給寫一下&#xff0c;每次都太懶了&#xff0c;都是想起了才來寫一下。今天只討論游戲服務器的網關服務器。 1.轉發 轉發客戶端和服務器間的消息&#xff0c;網關將場景、會話、數據、名字、平臺等服務器的數據轉發給客戶端&#xff0c;接收客戶端的數據&a…

算法(26)-最長系列

最長系列1.LeetCode-32 最長有效括號--子串2.LeetCode-300 最長上升子序列--長度3.LeetCode-32 最長回文子串--是什么5.LeetCode-512 最長回文子序列--長度6.LeetCode-1143 最長公共子序列--長度6.LeetCode-128 最長連續序列--長度7.LeetCode-14 最長公共前綴-字符串8.劍指offe…

一個簡單的游戲服務器框架 .

最近一段時間不是很忙&#xff0c;就寫了一個自己的游戲服務器框架雛形&#xff0c;很多地方還不夠完善&#xff0c;但是基本上也算是能夠跑起來了。我先從上層結構說起&#xff0c;一直到實現細節吧&#xff0c;想起什么就寫什么。 第一部分 服務器邏輯 服務器這邊簡單的分為三…

游戲登陸流程 .

當公司有很多游戲的時候&#xff0c;那么公司往往會有一個統一的賬號管理平臺&#xff0c;就就像盛大通行證、網易通行證&#xff0c;戰網平臺&#xff0c;這些平臺統一管理游戲的賬號數據。 打個比方&#xff0c;現在我們玩星辰變&#xff0c;那么玩家登陸游戲的時候…

leetcode97 交錯字符串

給定三個字符串 s1, s2, s3, 驗證 s3 是否是由 s1 和 s2 交錯組成的。 示例 1: 輸入: s1 "aabcc", s2 "dbbca", s3 "aadbbcbcac" 輸出: true 示例 2: 輸入: s1 "aabcc", s2 "dbbca", s3 "aadbbbaccc" 輸…

算法(27)-最大系列

最大系列1.LeetCode-239 滑動窗口的最大值2.LeetCode-53 連續子數組的最大和3.LeetCode-152 乘積最大的子數組。4.劍指 Offer 14- I. 剪繩子為k個整數段&#xff0c;使各個段成績最大1.dp數學推導1.LeetCode-239 滑動窗口的最大值 窗口由左往右最大值數組Left&#xff0c;和由…

mysql數據庫表的導入導出

MySQL寫入數據通常用insert語句&#xff0c;如 復制代碼 代碼如下: insert into person values(張三&#xff0c;20)&#xff0c;&#xff08;李四&#xff0c;21&#xff09;&#xff0c;&#xff08;王五&#xff0c;70&#xff09;…; 但有時為了更快速地插入大批量數據或…

leetcode 33 搜索旋轉排序數組 到處是細節的好題

這個題想了想就會做&#xff0c;只是細節真的能卡死人&#xff0c;找了好久的bug。甚至我懷疑我現在的代碼可能還有錯&#xff0c;只是沒例子測出來。 假設按照升序排序的數組在預先未知的某個點上進行了旋轉。 ( 例如&#xff0c;數組 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1…

多線程中局部靜態變量初始化的陷阱

C當中常常需要一個全局唯一的對象實例&#xff0c;這時候&#xff0c;我們就會想到單件模式。如何實現這一模式&#xff1f;全局變量當然是一個簡單可行的方法&#xff0c;然而&#xff0c;這太丑陋。嗯&#xff0c;其實&#xff0c;丑陋倒也罷了&#xff0c;最嚴重的是它將引誘…

MachineLearning(8)-PCA,LDA基礎+sklearn 簡單實踐

PCA,LDA基礎sklearn 簡單實踐1.PCAsklearn.decomposition.PCA1.PCA理論基礎2.sklearn.decomposition.PCA簡單實踐2.LDAsklearn.discriminant_analysis.LinearDiscriminantAnalysis2.1 LDA理論基礎2.2 sklearn LDA簡單實踐1.PCAsklearn.decomposition.PCA 1.PCA理論基礎 PCA:&…

引用變量和引用數組

前兩天沒事干,重拾C++的一些書籍,翻到引用這,無意寫了些DD: 其實引用和指針有很多相似的地方,又有不同的(太多了,不過說到效率上,比如函數傳參數,我們可以用引用,指針,哪種好呢,引用不必為站再分配空間了,而指針還學要分配4字節的空間給指針變量) 我們知道如何…

leetcode198 打家劫舍

你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚上被小偷闖入&#xff0c;系統會自動報警。 給定一個代表每個房屋存放金額的…

linux下的RPC

一、概述 在傳統的編程概念中&#xff0c;過程是由程序員在本地編譯完成&#xff0c;并只能局限在本地運行的一段代碼&#xff0c;也即其主程序和過程之間的運行關系是本地調用關系。因此這種結構在網絡日益發展的今天已無法適應實際需求。總而言之&#xff0c;傳統過程調用模式…

算法(28)--矩陣搜索系列

矩陣搜索1.leetcode-200. 島嶼數量2.leetcode-695. 島嶼的最大面積3.leetcode-463. 島嶼的周長4.劍指 Offer 12. 矩陣中的路徑5.leetcode-329. 矩陣中的最長遞增路徑6.leetcode-1091. 二進制矩陣中的最短路徑1.leetcode-200. 島嶼數量 給你一個由 ‘1’&#xff08;陸地&#…

leetcode213 打家劫舍II

你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋&#xff0c;每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈&#xff0c;這意味著第一個房屋和最后一個房屋是緊挨著的。同時&#xff0c;相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚…

linux下安裝boost

以下是在ubuntu 7.10 (內核 2.6.22-14)下安裝的例子&#xff1a; 一、下載最新的 boost 庫&#xff0c;下載地址&#xff1a; http://www.boost.org/users/download/ 二、在適當的位置解壓 boost 庫&#xff0c;推薦把 boost 庫解壓到 /usr/local/ 下&#xff1a; $ cd dowlo…

PaperNotes(4)-高質量圖像生成-CGAN-StackGAN-Lapgan-Cyclegan-Pix2pixgan

cgan,stackgan,lapgan,cyclegan,pix2pixgan1.Conditional GAN1.1簡介1.2網絡結構與訓練1.3特點與用途2.Stack GAN2.1簡介2.2網絡結構與訓練2.3特點與用途3.Lap GAN3.1簡介3.2網絡結構與訓練3.3特點與用途4.Pix2pix GAN4.1 簡介4.2 網絡結構和訓練4.3 特點和用途5.Patch GAN6.Cy…