题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
题解
此题采用递归回溯的方法,通过分析本题括号生成的规则,设计递归函数,来生成所有的括号生成方案。
括号生成规则1:若左括号数以达到最大数量,则插入右括号
括号生成规则2:左括号未达到最大数量情况下,若左括号数等于右括号数,则插入左括号
括号生成规则3:左括号未达到最大数量情况下,若左括号数大于右括号数,既可以插入左括号,又可以插入右括号
代码
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
string current;
diguiFunction(result, 0, current, n);
return result;
}
void diguiFunction(vector<string> &result, int index, string current,int n) {
if (index==2*n) {
result.push_back(current);
return;
}
bool pang1 = panduanNumber(current);
bool pang2 = panduanBound(current,n);
//括号生成规则1:若左括号数以达到最大数量,则插入右括号
if (pang2) {
current += ')';
diguiFunction(result, index + 1, current, n);
}
else {
//括号生成规则2:左括号未达到最大数量情况下,
//若左括号数等于右括号数,则插入左括号
if (pang1) {
current += '(';
diguiFunction(result, index + 1, current, n);
}
//括号生成规则3:左括号未达到最大数量情况下,
//若左括号数大于右括号数,既可以插入左括号,又可以插入右括号
else {
current += '(';
diguiFunction(result, index + 1, current, n);
int k = current.size();
current.erase(k-1,1);
current += ')';
diguiFunction(result, index + 1, current, n);
}
}
}
bool panduanNumber(string str) {
int i = 0;
for (char c : str) {
if (c == '(') i++;
}
//若左括号大于右括号数,则返回false;否则(左括号等于右括号)返回true
//若大于则既可以插入左括号和右括号,若等于只能左括号
//这种规则不会出现左括号数小于右括号数
if (i > (str.size() - i)) return false;
else return true;
}
bool panduanBound(string str,int n) {
int i = 0;
for (char c : str) {
if (c == '(') i++;
}
//当左括号的数量达到最大值时,返回真,否则返回假
if (i < n) return false;
else return true;
}
};
参考链接
https://leetcode-cn.com/problems/generate-parentheses/