leetcode22 括號生成

2021-10-05 20:30:03 字數 1312 閱讀 1990

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

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

[「((()))」,

「(()())」,

「(())()」,

「()(())」,

「()()()」

]分枝限界法。 其實就是乙個dfs的遞迴樹

由於字串只有左括號和右括號兩種字元,而且最終結果必定是左括號3個,右括號3個,所以我們定義兩個變數left和right分別表示剩餘左右括號的個數

如果在某次遞迴時,剩餘的左括號的個數大於剩餘右括號的個數,說明此時生成的字串中右括號的個數大於左括號的個數,即會出現'())'這樣的非法串,所以這種情況直接返回,不繼續處理。這是遞迴出口1

往下肯定不滿足 這是遞迴樹的減枝

如果left和right都為0,則說明此時生成的字串已有3個左括號和3個右括號,且字串合法,則存入結果中後返回。遞迴出口2

如果以上兩種情況都不滿足,若此時left大於0,則呼叫遞迴函式,注意引數的更新,若right大於0,則呼叫遞迴函式,同樣要更新引數。**如下:

vector

generateparenthesis

(int n)

void

dg(vector

&ans, string s,

int left,

int right)

if(left >0)

dg(ans, s +

"(", left -

1, right);if

(right >0)

dg(ans, s +

")", left, right -1)

;}

回溯

c++**裡直接傳入臨時變數所以 不用回溯刪除 沒有影響

public list

generateparenthesis

(int n)

void

helper

(list

ans, stringbuilder path,

int left,

int right)

if(left >0)

if(right >0)

}

LeetCode22 括號生成

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

leetcode 22 括號生成

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

leetcode 22 括號生成

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