Fork me on GitHub

LeetCode 22 Generate Parentheses(找到所有匹配的括号组合)

 
给一个整数n,找到所有合法的 () pairs 
 

For example, given n = 3, a solution set is:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

递归程序:首先合法的pairs一定是左括号个数等于右括号个数。因此对于n对pairs,左括号个数为n个。
递归程序,按照括号个数进行判断。当左括号个数小于n时,str+”(“,当右括号个数小于左括号个数时,str+”)”
 
分析递归程序需要传递的参数:
首先要将保存结果的List<String> list传递进去,然后是每次修改之后的str,之后需要知道左括号个数 open ,还有右括号个数 close , 最后是最大括号个数为 max
 
private void backtrack(List<String> list,String str, int open, int close, int max)
 
当str长度等于2*max时,说明结束,此时需要执行 list.add(str)
当open < max 时 添加一个( 执行     backtrack ( list, str + ”(“, open+1, close, max);
当close < open 时 添加一个 ) 执行 backtrack ( list, str+ “)”, open, close +1 ,max);
 
因此执行顺序为: 先得到右括号个数连续个数为max时(从下标为0开始)的情况,在得到右括号连续个数为max-1 时的情况 (此时会进行执行添加右括号的命令) 
 
参考代码:
 
package leetcode_50;

import java.util.ArrayList;
import java.util.List;

/***
 * 
 * @author pengfei_zheng
 * n对合理括号结果求解问题
 */
public class Solution22 {
    public static List<String> generateParenthesis(int n) {
        List<String> list = new ArrayList<>();
        backtrack(list,"",0,0,n);
        
        return list;
    }
    private static void backtrack(List<String> list,String str, int open, int close, int max) {
        if(str.length()==2*max){
            list.add(str);
            return;
        }
        if(open<max)
            backtrack(list,str+"(",open+1,close,max);
        if(close<open)
            backtrack(list,str+")",open,close+1,max);
    }
    public static void main(String[]args){
        List<String> list = generateParenthesis(3);
        System.out.println(list);
    }
}

 

 
 
 
posted @ 2017-03-08 13:11  伊甸一点  阅读(274)  评论(0编辑  收藏  举报