一、题目
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
提示:
1 <= n <= 8
二、思路解析
这种题是属于找规律的类型,刚好也是我的弱项,不看题解还真想不出。
仔细观察,我们就可以发现,合法的答案,从左往右遍历,左括号的数量始终大于等于右括号的数量,并且左括号的总数量与右括号的总数量相等。
并且,老规矩,相同的子问题,往递归上面靠。
因此我们在递归时需要进⾏以下判断:
1. 放入左括号时需判断此时左括号数量是否小于字符串总长度的⼀半(若左括号的数量大于等于字符串长度的⼀半时继续放置左括号,则左括号的总数量⼀定大于右括号的总数量);
2. 放⼊右括号时需判断此时右括号数量是否小于左括号数量。
而递归结束条件则是,当前状态字符串⻓度与 2*n 相等时,也就是刚好括号都是成对的时候。
三、完整代码
class Solution {
int left;
int right;
int n;
StringBuffer path;
List<String> ret;
public List<String> generateParenthesis(int _n) {
n = _n;
ret = new ArrayList<>();
path = new StringBuffer();
dfs();
return ret;
}
public void dfs(){
if(right == n){
ret.add(path.toString());
return;
}
if(left < n){
path.append('(');
left ++;
dfs();
path.deleteCharAt(path.length() - 1);
left --;
}
if(right < left){
path.append(')');
right ++;
dfs();
path.deleteCharAt(path.length() - 1);
right --;
}
}
}
以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!