題目描述
給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。
例如,給出 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
((()))
(()())
(())()
()(())
()()()
[((())), (()()), (())(), ()(()), ()()()]