22. 括号生成
题目:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
解题思路:
我觉得本质上来说,就是从数组中[‘(’, ‘)’]可重复地选择元素,生成一个长度为2n的括号组合。为了使这个括号组合是有效的,那么在选择的过程中就有一些约束:
1、左括号的数量不能超过n。
2、左括号的数量不能小于有括号的数量。
3、当左括号和有括号的数量都等于n时,就是收获结果的时候。
4、因为我们的path是使用的字符数组,直接覆盖掉了之前的值,所以不用恢复现场。只用恢复cnt1和cnt2即可。
class Solution {private List<String> result = new ArrayList<>();private char[] path;private static final char[] ch = new char[]{'(', ')'};public List<String> generateParenthesis(int n) {path = new char[2*n];backtrack(n, 0, 0);return result;}private void backtrack(int n, int cnt1, int cnt2){if(cnt1 == n && cnt2 == n){result.add(new String(path));return;}if(cnt1 > n || cnt1 < cnt2){return ;}for(char c : ch){path[cnt1 + cnt2] = c;if(c == '('){cnt1++;}else{cnt2++;}backtrack(n, cnt1, cnt2);if(c == '('){cnt1--;}else{cnt2--;}}}
}