给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
这个问题第一反应是暴力穷举。n为几,就创建几对括号,然后排列组合,去掉重复和无效的。
例如n=1,就是生成两组() 括号,编号为A1( A2)
可能的组合就是两组
A1--A2 ( )
A2--A1 )(
第二组无效,去掉。只剩第一组()
例如n=2,就是生成两组() 括号,编号为A1 A2 ,B1 B2
可能的组合就有
A1 A2 B1 B2 () ()
等24中组合
推倒到N=2时已经发现可能性膨胀的过于厉害,所以直接pass这种方案。
Google一下,有人提出深度优先遍历DFS方法。(牛人真多)
把自己的理解和体会记录一下。
这种方法就相当于去取括号。N=1,就是从一组()里面取。
N=2就是从()()里面取
N=3就是从()()()里面取。如下图所示。取的时候需要注意,右括号的数量不能超过左括号
等画出来这个图,是不是发现特别像二叉树?
下面是具体的kotlin代码
class Solution {
fun generateParenthesis(n: Int): List<String> {
var list: MutableList<String> = mutableListOf<String>()
appendStr(0, 0, list, "", n)
return list
}
private fun appendStr(left: Int, right: Int, list: MutableList<String>, temp: String, count: Int) {
if (count == left && count == right) {
list.add(temp)
}
if (left < count) {
appendStr(left + 1, right, list, "$temp(", count)
}
if (right < left) {
appendStr(left, right + 1, list, "$temp)", count)
}
}
}
测试通过