题目描述
数字n代表成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。
举例
示例1:
输入: n = 3, 输出: ["((()))", "(()())", "(())()", "()(())", "()()()"]
示例2:
输入: n = 1, 输出: ["()"]
解题方法: 递归法。
(generate(k))generate(n-k-1) ==> generate(k)表示生成k对括号的结果
上面的表达式将整个结果分成三个部分, (left)right,
第一部分:(),大小为1。
第二部分:left, 大小为generate(k)
第三部分:right,大小为generate(n-k-1)
三部分加起来为:1+ k + (n-k-1) = n
代码
#include <iostream>
#include <string>
#include <vector>
std::vector<std::string> generate(int n) {
std::vector<std::string> result;
if (n == 0) {
return {""};//注意这里的""不能少,因为(xxx),xxx为""的时候,size=1
}
// 一分为二: ( generate(k) )generate(n-k-1)
for (int k = 0; k < n; k++) {
auto left_result = generate(k);//左边的数组
auto right_result = generate(n - k - 1);//右边的数组
for (auto& lvalue : left_result) {
for (auto& rvalue : right_result) {
result.push_back("(" + lvalue + ")" + rvalue);
}
}
}
return result;
}
void print_arr(int n, const std::vector<std::string>& result) {
std::cout << "n=" << n << std::endl;
for (auto& value : result) {
std::cout << value << std::endl;
}
}
int main() {
// case n = 3
int n = 3;
auto result = generate(n);
print_arr(n, result);
// case n = 1
return 0;
}
代码运行结果如下:
n=3
()()()
()(())
(())()
(()())
((()))