LeetCode-- 括号生成(回溯法)

                                            算法-- 括号生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[

  "((()))",

  "(()())",

  "(())()",

  "()(())",

  "()()()"

]

 

方法1 回溯法 

只有在我们知道序列仍然保持有效时才添加 '(' or ')',而不是像 方法一 那样每次添加。我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,

如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括号。 

/**
 * @Auther: liuhaidong
 * Data: 2019/9/23 0023、11:56
 * Description:
 * @version: 1.0
 */
public class generateParenthesis {
    public static void main(String[] args) {
        System.out.println("请输入生成的括号对数");
        Scanner sc = new Scanner(System.in);
        System.out.println(generateParenthesis(Integer.parseInt(sc.nextLine())));
    }
    public static List generateParenthesis(int n) {
        List stringList = new ArrayList<>();
        backtrack(stringList, "", 0, 0, n);
        return stringList;
    }

    public static void backtrack(List ans, String cur, int open, int close, int max){
        if (cur.length() == max * 2) {
            ans.add(cur);
            return;
        }

        if (open < max)
            backtrack(ans, cur+"(", open+1, close, max);
        if (close < open)
            backtrack(ans, cur+")", open, close+1, max);
    }
}

LeetCode-- 括号生成(回溯法)_第1张图片 

LeetCode-- 括号生成(回溯法)_第2张图片

代码二

class Solution {
    public List generateParenthesis(int n) {
        List list=new ArrayList();
        String str=new String();
        generate(list,str,n,n);
        return list;
    }
    //list的改动是全局性的,但是str每次传递时并不是将本身传给下面,而是str+‘(’或者str+')'传递,所以下一层的改动并不会影响上一层。
    public void generate(List list,String str,int left,int right){
        if(left==0&&right==0){
            list.add(str);
            return;
        }
        if(left>0){
            generate(list,str+'(',left-1,right);
        }
        if(right>left){
            generate(list,str+')',left,right-1);
        }
    }
}

代码三

public class Main {

    static List stringList = new ArrayList<>();
    public static void main(String[] args) {
        System.out.println("请输入生成的括号对数");
        Scanner sc = new Scanner(System.in);
        generateParenthesis(Integer.parseInt(sc.next()));
        System.out.println(stringList);
    }

    public static void generateParenthesis(int n) {
        gen(0,0,n,"");
    }
    private static void gen(int left,int right,int sum,String result){
        if(left == sum && right == sum){
            stringList.add(result);
            return;
        }
        if(left < sum){
            gen(left +1,right,sum,result+"(");
        }
        if(right < sum && left > right){
            gen(left,right+1,sum,result+")");
        }
    }
}

 

你可能感兴趣的:(#,LeetCode回溯法)