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); } } }
相关文章推荐
- Generate Parentheses -- LeetCode
- 【leetcode】 Generate Parentheses (middle)☆
- LeetCode第21题之Generate Parentheses(两种解法)
- [LeetCode]Generate Parentheses
- [LeetCode]题解(python):022-Generate Parentheses
- leetCode力扣之Generate Parentheses
- leetcode之 Generate Parentheses
- 【LeetCode-面试算法经典-Java实现】【022-Generate Parentheses(生成括号)】
- LeetCode 22 Generate Parentheses
- LeetCode-Generate Parentheses
- LeetCode Generate Parentheses DFS或者生产呢排列
- 【LeetCode】【Array】【22】Generate Parentheses
- leetcode[22]Generate Parentheses
- LeetCode-22-Generate Parentheses(DFS/递归)-Medium
- leetcode - Generate Parentheses
- LeetCode 笔记系列五 Generate Parentheses
- Generate Parentheses -- leetcode
- [leetcode] Generate Parentheses
- 23 leetcode - Generate Parentheses
- [LeetCode] Generate Parentheses