题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:
输入:n = 1
输出:[“()”]
提示:
1 <= n <= 8
解题思路
这个问题可以通过回溯法来解决,回溯法是一种通过不断尝试可能的选择并回退的方法来解决问题的技术。
- 我们从空字符串开始,不断地添加左括号和右括号,但是需要满足一些条件,以确保生成的括号序列是有效的。
- 在每一步,我们有两个选择:
- 添加一个左括号,前提是左括号的数量不超过n。
- 添加一个右括号,前提是右括号的数量不超过左括号的数量。
- 我们通过递归来尝试所有可能的选择。在每一步,我们都根据当前的选择继续递归调用,直到生成的字符串长度达到2 * n。如果生成的字符串是有效的,就将其添加到结果列表中。
这个算法的关键在于递归的思想,每一步都在当前的字符串基础上继续拼接括号,直到达到目标长度。递归的过程中会有一些条件判断来限制括号的添加,以确保生成的括号序列是有效的。
代码
object Solution {
def generateParenthesis(n: Int): List[String] = {
def backtrack(s: String, left: Int, right: Int): List[String] = {
if (s.length == 2 * n) {
List(s)
} else {
var result: List[String] = List.empty
if (left < n) {
result = result ::: backtrack(s + '(', left + 1, right)
}
if (right < left) {
result = result ::: backtrack(s + ')', left, right + 1)
}
result
}
}
backtrack("", 0, 0)
}
def main(args: Array[String]): Unit = {
val n = 3
val result = generateParenthesis(n)
println(result) // 输出 ["((()))","(()())","(())()","()(())","()()()"]
}
}