1、解题思路
- 回溯法:使用回溯法递归生成所有可能的括号组合。在每一步递归中,可以选择添加开括号 ( 或闭括号 ) ,但必须满足以下条件:
开括号的数量不能超过 n。闭括号的数量不能超过开括号的数量。当开括号和闭括号的数量均等于 n 时,得到一个合法组合。时间复杂度:O(2^n),空间复杂度:O(n)(递归栈的深度)。
- 动态规划:可以基于动态规划的思想,利用小规模问题的解来构建大规模问题的解。这种方法的时间复杂度也是 O(2^n),但空间复杂度略高。
2、代码实现
C++
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return string字符串vector
*/
vector<string> generateParenthesis(int n) {
// write code here
vector<string> result;
backtrack(result, "", 0, 0, n);
return result;
}
void backtrack(vector<string>& result, string current, int open, int close,
int max) {
if (current.length() == max * 2) {
result.push_back(current);
return ;
}
if (open < max) {
backtrack(result, current + "(", open + 1, close, max);
}
if (close < open) {
backtrack(result, current + ")", open, close + 1, max);
}
}
};
Java
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return string字符串ArrayList
*/
public ArrayList<String> generateParenthesis (int n) {
// write code here
ArrayList<String> result = new ArrayList<>();
backtrack(result, "", 0, 0, n);
return result;
}
private void backtrack(ArrayList<String> result, String current, int open, int close, int max) {
if (current.length() == max * 2) {
result.add(current);
return;
}
if (open < max) {
backtrack(result, current + "(", open + 1, close, max);
}
if (close < open) {
backtrack(result, current + ")", open, close + 1, max);
}
}
}
Python
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param n int整型
# @return string字符串一维数组
#
class Solution:
def generateParenthesis(self , n: int) -> List[str]:
# write code here
result = []
self.backtrack(result, "", 0, 0, n)
return result
def backtrack(self, result, current, open, close, max):
if len(current) == max * 2:
result.append(current)
return
if open < max:
self.backtrack(result, current + "(", open + 1, close, max)
if close < open:
self.backtrack(result, current + ")", open, close + 1, max)
3、复杂度分析
- 递归条件:
开括号的数量不能超过 n,否则无法闭合。闭括号的数量不能超过开括号的数量,否则会出现不匹配的闭括号。
- 终止条件:
当当前字符串的长度等于 n * 2 时,说明已经生成了一个合法的括号组合。
- 效率:
时间复杂度:O(2^n),因为每个位置最多有两种选择(开括号或闭括号)。空间复杂度:O(n),用于存储递归栈和当前字符串。
- 适用性:
回溯法是解决括号生成问题的经典方法,适用于小规模数据(n ≤ 10)。如果数据规模较大,应考虑其他优化方法或限制条件。