题目描述:LeetCode原题地址
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
思路: 用回溯的思想。题目的有效括号的意思是每一个左括号都有一个右括号与之匹配,且生成的字符串的长度为2n
。设left
为当前生成的左括号的个数,right
为当前生成的右括号的个数,当字符串长度为2n
时结束生成括号的过程。当left < right
时,说明此时生成的右括号数大于左括号数,肯定无法再继续生成有效字符串,直接返回。当left > right
时说明左括号数大于右括号数,此时需要给字符串加上右括号。最开始生成都是从生成左括号开始,即当left < n
,左括号的个数没达到n
时继续生成左括号。
代码:
class Solution {
public:
vector<string> generateParenthesis(int n) {
//存储结果字符串
vector<string> result;
//回溯法递归
backtrack(result, "", 0, 0, n);
return result;
}
//left表示当前生成的左括号的个数,right表示当前生成的右括号的个数
void backtrack(vector<string> &result, string str, int left, int right, int n)
{
if(right > left){
return;
}
if(str.length() == 2 * n){
result.push_back(str);
return;
}
//如果当前生成的左括号的个数小于n(n为需要),则加上一个左括号
if(left < n){
backtrack(result, str + "(", left + 1, right, n);
}
//如果当前生成的左括号的个数大于生成的右括号的个数,则加上一个右括号
if(left > right){
backtrack(result, str + ")", left, right + 1, n);
}
}
};