演算法刷題筆記 括號生成

2021-10-06 18:39:45 字數 1693 閱讀 7926

請你寫乙個演算法,輸入是乙個正整數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...