22. 括号生成
Posted boboboo610
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了22. 括号生成相关的知识,希望对你有一定的参考价值。
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
法一:
1 public List<String> generateParenthesis(int n) { 2 ArrayList<String> ans = new ArrayList<>(); 3 char[] chars = new char[2*n]; 4 int pos = 0; 5 scheng(chars,pos,ans); 6 return ans; 7 } 8 //递归生成所有组合情况 9 public void scheng(char[] chars,int pos,ArrayList<String> ans){ 10 if(pos == chars.length){ 11 if(xing(chars)) 12 ans.add(new String(chars)); 13 }else { 14 chars[pos] = ‘(‘; 15 scheng(chars,pos+1,ans); 16 chars[pos] = ‘)‘; 17 scheng(chars,pos+1,ans); 18 } 19 } 20 //验证是否符合条件 21 public boolean xing(char[] chars){ 22 int balance = 0; 23 for (char c : chars) { 24 if(c == ‘(‘) 25 balance++; 26 else 27 balance--; 28 if(balance<0)//一旦出现单“)” 则必然不匹配 29 return false; 30 } 31 return balance == 0; 32 }
暴力枚举所有组合 再判断是否符合条件
法二:
1 public List<String> generateParenthesis(int n) { 2 ArrayList<String> ans = new ArrayList<>(); 3 String cur = ""; 4 scheng(cur,0,0,n,ans); 5 return ans; 6 } 7 public void scheng(String cur,int kai,int bi,int max,ArrayList<String> ans){ 8 if(cur.length() == 2*max){ 9 ans.add(cur); 10 return; 11 } 12 13 if(kai < max)//保证左括号满足对数要求 14 scheng(cur+"(",kai+1,bi,max,ans); 15 if(bi < kai)//保证右括号和左括号对应 16 scheng(cur+")",kai,bi+1,max,ans); 17 18 }
回溯法,只考虑“( ”个数,因为先运行左括号,所以不会出现右括号多余情况。
每有一个(,则必有一个)对应,则多次递归,直至字符串长度等于2n。相比较法一,少计算不符合条件的组合。
以上是关于22. 括号生成的主要内容,如果未能解决你的问题,请参考以下文章