描述:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
示例:
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路:
这道题可以用回溯法解决,即穷举出所有可能,再按照规则过滤结果。但是更好的办法是在回溯的过程中,就进行规则的判断,进行剪枝操作:
只有在我们知道序列仍然保持有效时才添加 '(' or ')',我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,
如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括号。
java:
class Solution { /** * 主方法. * * @param n 括号个数 * @return 合法括号集合 */ public List<String> generateParenthesis(int n) { List<String> resultList = new ArrayList<>(10); helper(resultList, "", 0, 0, n); return resultList; } /** * 功能方法. * * @param list 有效括号集合 * @param temp 字符串 * @param open 左括号个数 * @param close 右括号个数 * @param n 括号个数 */ private void helper(List<String> list, String temp, int open, int close, int n) { if (open == n && close == n) { list.add(temp); return; } if (open < n) { helper(list, temp + "(", open + 1, close, n); } if (close < open) { helper(list, temp + ")", open, close + 1, n); } } }
结果:
python3:
class Solution: def generateParenthesis(self, n: int) -> List[str]: lists = [] def helper(tmp='', open=0, close=0): if open == n and close == n: lists.append(tmp) return if open < n: helper(tmp + '(', open + 1, close) if close < open: helper(tmp + ')', open, close + 1) helper() return lists