题目:
给定n对括号,编写一个函数来生成所有格式良好的括号组合。
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
参考:
https://www.cnblogs.com/grandyang/p/4444160.html
思路:
(其实大佬的里面写得蛮清楚了嗷)
因为是要生成n对括号的字符串的所有组合,因此,每个字符串其实都包括n个左括号和n个右括号,每个位置都有两种可能,即左括号/右括号
设第k步得到了字符串s,先检查字符串是否满足条件——即是否包含非法字符,如果包含则直接跳过,如果不包含,则对其下一个位置分别放左括号、右括号两种情况继续进行第k+1步
其中,判断字符串是否满足条件的方法是:检查在该字符串时,是否【剩余的左括号个数】 小于 【剩余的右括号个数】 ,也就是:字符串中是否【左括号数 ≥ 右括号数】,如果【左括号数 < 右括号数】,则肯定有【左括号无法找到其匹配的右括号】的情况
当【剩余的左括号个数 == 0】且【剩余的右括号个数 == 0】时,说明此时所有的括号都放置完成,将此时的字符串加入到需要返回的List中
代码:
public class Solution {
public List<String> generateParenthesis(int n) {
List<String> re = new LinkedList<String>();
helper(n,n,"",re);
return re;
}
void helper(int left, int right, String out, List<String> re) {
// 不符合条件
if(left<0 || right<0 || left>right) {
return;
}
// 放置完成
if(left==0 && right==0) {
re.add(out);
return;
}
// 未放置完成,按两种情况分别继续放置
helper(left-1, right, out+"(", re);
helper(left, right-1, out+")", re);
}
}