leedcode 括號生成

題目描述

題目鏈接leedcode22

給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。

例如,給出 = 3,生成結果爲:

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

 思路參考:

只有在我們知道序列仍然保持有效時才添加 '(' or ')',。我們可以通過跟蹤到目前爲止放置的左括號和右括號的數目來做到這一點,如果我們還剩一個位置,我們可以開始放一個左括號。 如果它不超過左括號的數量,我們可以放一個右括號。

 

public class Main_10
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//輸入括號的對數
        List<String> answer = new ArrayList<>();
        backtrack(answer, "", 0, 0, n);
        // 輸出方法 1
        for(int i=0; i<answer.size();i++)
        {
            System.out.println(answer.get(i));
        }
        // 輸出方法 2
        System.out.println(answer);

        sc.close();
    }
    //open代表"("的個數,close代表 ")"的個數
    public static void backtrack(List<String> 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);
        }
    }
}

輸出結果

3
((()))
(()())
(())()
()(())
()()()
[((())), (()()), (())(), ()(()), ()()()]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章