您的位置:首页 > 其它

Generate Parentheses:生成括号对

2017-10-13 15:14 459 查看
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:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]


思路一:递归求解:举出所有可能的组合,在判断是否合法

class Solution {
public boolean test(int[] record){
Stack<Integer> st = new Stack<Integer>();
for(int i:record){
if(i==1){
st.push(0);
}else if(st.isEmpty()||st.pop()!=0){
return false;
}
}
return st.isEmpty();
}

public void dfs(List<String> list,int count,int n,int index,int[] record){//1表示'(',0表示')'

if(test(record)&&count==n){
System.out.println(Arrays.toString(record));
StringBuilder b = new StringBuilder();
for(int i:record){
if(i==1){
b.append("(");
}else{
b.append(")");
}
}
list.add(b.toString());
}else if(count>n){
return;
}else{
for(int i = index;i<2*n;i++){
record[i]=1;
dfs(list,count+1,n,i+1,record);
record[i]=0;
}
}
}

public List<String> generateParenthesis(int n) {
int[] record = new int[2*n];
ArrayList<String> list = new ArrayList<String>();
dfs(list,0,n,0,record);
return list;
}
}思路二:许多博客提到这事卡特兰树的变形,如http://www.cnblogs.com/grandyang/p/4444160.html。
下面代码思路:在已写出的结果中,右括号的数量一定不能大于左括号,否则:如(()))这种情况,就会多出一个右括号,由于在条件括号的方式是在后面添加,所以后续无论怎么添加都是非法结果。如果所有的括号都能写出,则结果是合法的。

public List<String> generateParenthesis(int n) {
List&l
4000
t;String> list = new ArrayList<String>();
generateOneByOne("", list, n, n);
return list;
}
public void generateOneByOne(String sublist, List<String> list, int left, int right){
if(left > right){
return;
}
if(left > 0){
generateOneByOne( sublist + "(" , list, left-1, right);
}
if(right > 0){
generateOneByOne( sublist + ")" , list, left, right-1);
}
if(left == 0 && right == 0){
list.add(sublist);
return;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: