LeetCode 22 括號生成

2021-09-28 16:55:04 字數 1808 閱讀 1607

題目描述:

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

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

[

"((()))",

"(()())",

"(())()",

"()(())",

"()()()"

]

方法一:暴力法

思路

我們可以生成所有 『(』 和 『)』 字元構成的序列。然後,我們將檢查每乙個是否有效。

演算法

為了生成所有序列,我們使用遞迴。長度為 n 的序列就是 『(』 加上所有長度為 n-1 的序列,以及 『)』 加上所有長度為 n-1 的序列。

為了檢查序列是否為有效的,我們會跟蹤 平衡,也就是左括號的數量減去右括號的數量的淨值。如果這個值始終小於零或者不以零結束,該序列就是無效的,否則它是有效的。

**:

public list

generateparenthesis

(int n)

public

void

generateall

(char

current,

int pos,list

result)

else

}public

boolean

valid

(char

current)

return

(balance==0)

;}

方法二:回溯法

思路和演算法

只有在我們知道序列仍然保持有效時才新增 『(』 or 『)』,而不是像 方法一 那樣每次新增。我們可以通過跟蹤到目前為止放置的左括號和右括號的數目來做到這一點,

如果我們還剩乙個位置,我們可以開始放乙個左括號。 如果它不超過左括號的數量,我們可以放乙個右括號。

public list

generateparenthesis

(int n)

public

void

backtrack

(list

ans,string cur,

int open,

int close,

int max)

if(openbacktrack

(ans,cur+

"(",open+

1,close,max);if

(closebacktrack

(ans,cur+

")",open,close+

1,max)

;}

方法三:閉合數

思路

為了列舉某些內容,我們通常希望將其表示為更容易計算的不相交子集的總和。

考慮有效括號序列 s 的 閉包數:至少存在 index >= 0,使得 s[0], s[1], …, s[2*index+1]是有效的。 顯然,每個括號序列都有乙個唯一的閉包號。 我們可以嘗試單獨列舉它們。

演算法

對於每個閉合數 c,我們知道起始和結束括號必定位於索引 0 和 2c + 1。然後兩者間的 2c 個元素一定是有效序列,其餘元素一定是有效序列。

public list

generateparenthesis

(int n)

else}}

}return ans;

}

LeetCode22 括號生成

題幹 給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 演算法思想 先看括號匹配,既然要達到括號匹配,就一定要滿足stack的操作 不多說 則組合數的結果則是卡特蘭數。要輸出正確組合數,可採用遞迴,用兩個變數l,r分別表示剩餘左...

leetcode 22 括號生成

給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 要把這個當成下棋,左括號為黑,右括號為白,則轉換為 3黑3白有幾種排列方式 每一步都有兩個選擇 下黑或者下白,但是場上下白子時剩下的黑子必須比剩下的白子多 比n 2時,有黑白黑白...

leetcode 22 括號生成

給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 參考官方題解 方法二 回溯法 只有在序列仍然保持有效才會新增 如果還有位置,我們可以開始放乙個左括號。如果不超過右括號數量不超過左括號的數量可以放乙個右括號。class solu...