Generate Parentheses 产生所有括号组合 @LeetCode

来源:互联网 发布:大数据架构师证书 编辑:程序博客网 时间:2024/06/06 04:09

要点:必须满足左括号数目要大等于右括号数目

典型的递归题,画出图来就很好理解。1,2分别对应着两种特殊情况。



package Level3;import java.util.ArrayList;/** * Generate Parentheses *  *  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:"((()))", "(()())", "(())()", "()(())", "()()()" * */public class S22 {public static void main(String[] args) {System.out.println(generateParenthesis(3));}public static ArrayList<String> generateParenthesis(int n) {ArrayList<String> list = new ArrayList<String>();rec(n, 0, 0, "", list);return list;    }public static void rec(int n, int left, int right, String s, ArrayList<String> list){// invariant必须满足左括号数目要大等于右括号数目if(left < right){return;}// 如果左右括号数目相等则添加到listif(left==n && right==n){list.add(s);return;}// 左括号已满,只能添加右括号if(left == n){rec(n, left, right+1, s+")", list);return;}rec(n, left+1, right, s+"(", list);// 继续添加左括号rec(n, left, right+1, s+")", list);// 继续添加右括号}}

Again:

一种新的写法,left,right表示手上有的左右括号括号数量。因此条件要改变一些。


public class Solution {    public ArrayList<String> generateParenthesis(int n) {        ArrayList<String> ret = new ArrayList<String>();        rec(n, n, "", ret);        return ret;    }        public void rec(int left, int right, String s, ArrayList<String> ret){        if(left==0 && right==0){            ret.add(s);            return;        }        if(left==0){            rec(left, right-1, s+")", ret);            return;        }        if(right==0){            return;        }        if(left > right){            return;        }        rec(left-1, right, s+"(", ret);        rec(left, right-1, s+")", ret);    }}






原创粉丝点击