演算法 25 括號

2021-10-09 08:39:23 字數 4137 閱讀 1943

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

輸入:n = 3

輸出:[

"(((

)))",

"(()(

))",

"(())()",

"()(())",

"()()()"

]

回溯法

def

generateparenthesis

(self, n)

: res =

defback_track

(s,left,right):if

len(s)==2

*n: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

給定乙個只包括 『(』,』)』,』』,』[』,』]』 的字串,判斷字串是否有效。

有效字串需滿足:左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。

注意空字串可被認為是有效字串。

輸入: "(){}"

輸出: 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

false

else

:# char 為左括號入棧

return

true

iflen

(stack)==0

else

false

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

給定乙個只包含 『(』 和 『)』 的字串,找出最長的包含有效括號的子串的長度。

輸入: "(()"

輸出: 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 下標的合理性

deflongestvalidparentheses

(self, s)

: n=

len(s)

if n<2:

return

0 dp=[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]

+2if s[i]

==")"

and s[i-1]

==")"

:if i-

1-dp[i-1]

>=

0and 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

刪除最小數量的無效括號,使得輸入的字串有效,返回所有可能的結果。

說明: 輸入可能包含了除 ( 和 ) 以外的字元。

輸入: "()())()"

輸出: [

"()()()", "(())()"

]

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

dfs:要求刪除的括號最少,每次刪除乙個,觀察刪除後的字串是否合法,如果已經合法,不用繼續刪除。

bfs:本層level和下一層level 之間的關係:本層level每個元素都拿出來,列舉刪除乙個括號後的所有可能,新增到下一層level 中。

解決重複性問題:吧level 中的list換成set

檢查括號是否合法:堆疊法

用filter(func, param) 可以得到param中所有符合條件的元素。

class

solution

(object):

defremoveinvalidparentheses

(self, s)

:"""

:type s: str

:rtype: list[str]

"""defis_valid

(string)

: count =

0for char in string:

if char ==

"(":

count +=

1elif char ==

")":

count -=

1if count <0:

# 中途中計數器如果小於0說明,不明多餘右括號出現

return

false

return count ==

0# bfs

level =

# 用set避免重複

while

true

: valid =

list

(filter

(isvalid, level)

)# 判斷同一層的所有刪除結果時候存在有效備選

if valid:

return valid

# 下一層level

next_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

7 1 括號匹配 25分

給定一串字元,不超過100個字元,可能包括括號 數字 字母 標點符號 空格,程式設計檢查這一串字元中的 是否匹配。輸入格式 輸入在一行中給出一行字串,不超過100個字元,可能包括括號 數字 字母 標點符號 空格。如果括號配對,輸出yes,否則輸出no。sin 10 20 yesno 利用堆疊,遇到左...

括號匹配演算法

檢驗括號是否匹配的方法可以用 期待的急迫程度 這個概念來描述。例如,考慮下列括號序列 1 2 3 4 5 6 7 8 當計算機接受了第乙個括號後,它期待著與其匹配的第八個括號的出現,然而等來的卻是第二個括號,此時第乙個括號 只能暫時靠邊,而迫切等待與第二個括號相匹配的 第七個括號 的出現,類似地,因...

括號匹配演算法

題目 有一段字串,包含 和 和 中的一種或者多種,這三種括號出現次序不定,可隨意巢狀。編寫 判斷三種括號是否正確匹配。思路一 棧的思想 括號匹配是運用棧的經典思想。在 演算法中設定乙個空棧,每次讀入乙個括號,若是左括號,則壓入棧中,等到對應的右括號壓棧,若是右括號,能使置於棧頂的最急迫的期待得以消解...