一、题目
1、题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:
输入:n = 1
输出:[“()”]
2、基础框架
- C++版本给出的基础框架如下:
3、原题链接
https://leetcode.cn/problems/generate-parentheses/
二、解题报告
1、思路分析
(
1
)
(1)
(1)一个有效的括号组成,其最左侧必定是"(“,只要确定其所匹配的“)”的所有可能位置,就能确定所有n个括号的所有组成。
(
2
)
(2)
(2)以n = 3为例,5种括号组成可以分解为[”(" + “(())” +“)”, “(” + “()()” + “)”, “(” + “()” +“)” + “()”, “(” + “)” + “(())”, “(” + “)” + “()()”]
(
3
)
(3)
(3)所有分解组合可以归纳为"(" + l + “)” + r
(
4
)
(4)
(4)l和r要么是"“要么是符合规范的括号组合。
(
5
)
(5)
(5)我们将最左侧的”(“及其匹配的”)"看作第n个括号,那么剩余的n-1个括号可以分成两部分,即l和r。即l.size() + r.size() = n-1
(
6
)
(6)
(6)因为l.size() 和r.size() 都小于n,所以如果我们知道了1~n-1个括号的所有组成,就可以遍历得到n个括号的所有组成。
2、时间复杂度
3、代码详解
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<vector<string>> dp(n + 1);
vector<string> t0;
vector<string> t1;
t1.push_back("()");
dp[0] = t0;
dp[1] = t1;
for (int i = 2; i < n + 1; i++) {
for (int p = 0; p < i; p++) {
vector<string> l = dp[p];
vector<string> r = dp[i - 1 - p];
string s;
if (l.size() == 0) {
for (int k = 0; k < r.size(); k++) {
s = "()" + r[k];
dp[i].push_back(s);
}
} else if (r.size() == 0){
for (int k = 0; k < l.size(); k++) {
s = "(" + l[k] +")";
dp[i].push_back(s);
}
} else {
for (int k = 0; k < l.size(); k++) {
for (int m = 0; m < r.size(); m++) {
s = "(" + l[k] + ")" + r[m];
dp[i].push_back(s);
}
}
}
}
}
return dp[n];
}
};