题目描述
给出 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
((()))
(()())
(())()
()(())
()()()
[((())), (()()), (())(), ()(()), ()()()]