請你寫乙個演算法,輸入是乙個正整數n
,輸出是n
對兒括號的所有合法組合,
比如說,輸入n=3
,輸出為如下 5 個字串:
c++:
#include #include #include using namespace std;
// 可用的左括號數量為 left 個,可用的右括號數量為 rgiht 個
void backtrack(int left, int right, string& track, vector& res)
// 嘗試放乙個左括號
track.push_back('('); // 選擇
backtrack(left - 1, right, track, res);
track.pop_back(); // 撤消選擇
// 嘗試放乙個右括號
track.push_back(')'); // 選擇
backtrack(left, right - 1, track, res);
track.pop_back(); // 撤消選擇
}vectorgenerateparenthesis(int n)
void main()
// 執行深度優先遍歷,搜尋可能的結果
dfs("", n, n, res);
return res.size();
}/**
* @param curstr 當前遞迴得到的結果
* @param left 左括號還有幾個沒有用掉
* @param right 右邊的括號還有幾個沒有用掉
* @param res 結果集
*/private void dfs(string curstr, int left, int right, listres)
// 因為每一次嘗試,都使用新的字串變數,所以沒有顯式的回溯過程
// 在遞迴終止的時候,直接把它新增到結果集即可,與「力扣」第 46 題、第 39 題區分
// 如果左邊還有剩餘,繼續遞迴下去
if (left > 0)
// 什麼時候可以用右邊?例如,((((((),此時 left < right,
// 不能用等號,因為只有先拼了左括號,才能拼上右括號
if (right > 0 && left < right)
}public static void main(string args)
}
class solution:
def generateparenthesis(self, n: int) -> list[str]:
res =
def backtrack(left,right,sub_res):
if left == 0 and right ==0:
return
if left > right or left < 0 or right < 0:
return
backtrack(left-1,right,sub_res)
sub_res.pop()
backtrack(left,right-1,sub_res)
sub_res.pop()
backtrack(n,n,)
return res
刷題 生成正確括號組合
題目描述 給定n對括號,編寫乙個函式來生成正確括號的所有組合。例如,給定n 3,解決方案集合為 採用遞迴 每次左括號比右括號多時可以加左括號或者右括號 如果左括號等於右括號則只能加左括號 左括號夠了那就只加右括號 右括號夠了那就只加左括號 void generate vector v,int x,i...
leetcode刷題(51) 22 括號生成
給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 思路 只要有左括號就可以新增 class solution public void helper int left,int right,string str if left 0 ...
Leetcode演算法題22 括號生成
廣度優先 佇列實現 自定義結點類 反思與總結 class solution if left n 當右括號的個數少於左括號的個數時,括號不閉合,可以新增右括號 if right left public list generateparenthesis int n class node public n...