题目:
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;
}
}