[LeetCode] 22. Generate Parentheses Java
题目:
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
题意及分析:这道题是给出一个括号对的数目,求可能的合法的括号顺序。这道题可以应用回溯(这也是我做的第一道回溯题->->,也不知道怎么讲。。),对题目进行观察可知边界条件为 在任一个合法字符串的子字符串中:左括号数目大于等于右括号数目、左括号数<=n,所以我们可以得出回溯点。下面的代码我是用递归求解的,也可以用非递归求。首先用一个char类型的数组保存当前得到的值,然后每次对char[]进行判断,符合条件就进行下一个位置的求解,直到最后一个位置(i=2*n-1).
代码:
public class Solution { public List<String> generateParenthesis(int n) { List<String> resList = new ArrayList<>(); char[] possible=new char[2*n]; traceBack(resList,possible,0, 2*n); return resList; } public void traceBack(List<String> resList,char[] possible,int t,int m){ //这里的m=2*n char[] x={'(',')'}; if(t>=m){ //有解,输出结果 String string=String.valueOf(possible); resList.add(string); }else{ for(int i=0;i<=1;i++){ int left=0,right=0; possible[t]= x[i]; for(int j=0;j<=t;j++){ if(possible[j]==')'){ right++; }else left++; } //边界条件为(的数目大于等于)数,且left<=n if(left>=right&&left<=m/2){ //继续下一维度的计算 traceBack(resList,possible,t+1, m); } } } return; } }