您的位置:首页 > 其它

LeetCode - Generate Parentheses

2017-11-11 00:00 330 查看
package GenerateParentheses;

import java.util.ArrayList;

/*	GIVEN: A Int represents the number of pairs of "(" and ")" we have.
* 	RETURNS: All possible VALID combinations of "(" and ")"
* 	EXAMPLE: INPUT:3
* 			 OUTPUT: "((()))", "()()()", "(())()", "()(())", "(()())"
* */
public class Solution {
public static void main(String[] args){
Solution s = new Solution();
//ArrayList<String> storage = new ArrayList<String>();
//s.generateParentheses(storage, 3, 0, "");

ArrayList<String> storage = s.generateParenthesesDP(3);
for (String str: storage) System.out.println(str);
}

// 方法一:括号逻辑,然后递归;
public void generateParentheses( ArrayList<String> all_parentheses,
int left,
int right,
String curr_str){
if(!(left==0 && right==0)){
all_parentheses.add(curr_str);
System.out.println("*"+curr_str);
//return;
}

// left的含义是: 还剩下几个左括号没有添加进str
// right的含义是:str中有几个左括号没有被匹配右括号。
// 所以此处是先看str中有没有左括号没被匹配(if right>0),如果没被匹配就先匹配;
// 匹配完str中当前的左括号后,再添加新的左括号进str(if left>0).
if (right>0)
generateParentheses(all_parentheses, left, right-1, curr_str+")");
if (left>0)
generateParentheses(all_parentheses, left-1, right+1, curr_str+"(");

}

/* 方法二:Dynamic Programming
* DP解法:
* 设当输入为n-1的时候,所有可能的括号排列组合解为f(n-1),
* 那么当输入为n时,实际上是在尝试往f(n-1)中再添加一对括号;
* 假设新加入的括号对的左括号“(”在最左端,那么问题就变成了往原来f(n-1)字符串中
* 插入一个“)”使得这对新加入的括号对里面有i对括号的所有可能的排列组合f(i),
* 而括号外有f(n-1-i).
* 为了更清楚地表示:(假设新加入的括号对的左括号在最左端)
* f(0)= ""
* f(1)= "("f(0)")"
* f(2)= "("f(0)")"f(1), "("f(1)")"f(0)
* f(3)= "("f(0)")"f(2), "("f(1)")"f(1), "("f(2)")"f(0)
* f(4)= "("f(0)")"f(3), "("f(1)")"f(2), "("f(2)")"f(1),"("f(3)")"f(0)
* ...
* f(n)= "("f(0)")"f(n-1), "("f(1)")"f(n-2),...,"("f(i)")"f(n-1-i),..., "("f(n-1)")"f(0)
*
* */
public ArrayList<String> generateParenthesesDP(int pair_num){
ArrayList<ArrayList<String>> res = new ArrayList<ArrayList<String>>();

res.add(new ArrayList<String>(){{add("");}});

// 第一个循环,表示从f(0),f(1)...逐个求至f(n)
for (int n=1; n<=pair_num; n++){
ArrayList<String> solu_for_one = new ArrayList<String>();

// 第二个循环,表示新加的括号对内部从f(0)逐个加至f(n)
for (int i=0; i<n; i++){

// 第三个循环,表示当括号内当前为f(i)时,遍历f(i)所代表的i个括号对的所有可能排列组合
for (String first: res.get(i)){

// 第四个循环, 表示当括号内当前为f(i)时,即括号外为f(n-1-i),遍历f(n-1-i)所代表的n-1-i个括号对的所有可能排列组合
for (String second: res.get(n-1-i)){
solu_for_one.add("("+first+")"+second);
}
}
}
res.add(solu_for_one);
}
return res.get(res.size()-1);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: