【回溯】22. 括号生成 (看看方法三 按括号序列的长度递归)
题目:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解答:
方法一:暴力法
class Solution { public List<String> generateParenthesis(int n) { char[] chs = new char[n*2]; List<String> res = new ArrayList<>(); generate(chs,0, res); return res; } public void generate(char[] chs,int cur, List<String> res){ if(cur == chs.length){ if(isValid(chs)){ res.add(new String(chs)); } } else{ chs[cur] = '('; generate(chs,cur+1,res); chs[cur] = ')'; generate(chs,cur+1,res); } } public boolean isValid(char[] chs){ int balance =0; for(char ch:chs){ if(ch =='('){ balance++; } else{ balance--; } if(balance<0){ return false; } } return balance == 0; } }
方法二:回溯
class Solution { public List<String> generateParenthesis(int n) { //char[] chs = new char[n*2]; List<String> res = new ArrayList<>(); StringBuilder str = new StringBuilder(); generate(0,0,n,str,res); return res; } public void generate(int open,int close,int max,StringBuilder str, List<String> res){ if(str.length() == max*2){ res.add(str.toString()); } else{ if(open<max){ str.append("("); generate(open+1,close,max,str,res); str.delete(str.length()-1,str.length()); } if(close<open){ str.append(")"); generate(open,close+1,max,str,res); str.delete(str.length()-1,str.length()); } } } }
方法三:

浙公网安备 33010602011771号