題目:括號生成(力扣22)
題目描述:
給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。
例如,給出 n = 3,生成結果爲:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
解題思路:
只有在我們知道序列仍然保持有效時才添加 ‘(’ or ‘)’。我們可以通過跟蹤到目前爲止放置的左括號和右括號的數目來做到這一點,如果我們還剩一個位置,我們可以開始放一個左括號。 如果它不超過左括號的數量,我們可以放一個右括號。
代碼實現:
class Solution {
public List<String> generateParenthesis(int n) {
//記錄所有有效的結果
List<String> list=new ArrayList<>();
//代碼的魯棒性
if(n==0) {
return list;
}
//左右括號的個數使用過的個數分別爲0
//用res 來表示生成的結果字符串
String res="";
helper(list,0,0,n,res);
return list;
}
private void helper(List<String> list, int left, int right, int n, String res) {
//左右括號都等於n時,括號生成完畢,添加到結果集合list中
if(left==n && right==n) {
list.add(res);
return;
}
//先放左括號
if(left<n) {
helper(list,left+1,right,n,res+"(");
}
//右括號前面有左括號,且右括號的個數還沒有用光
if(left>right && right<n) {
helper(list,left,right+1,n,res+")");
}
}
}