数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。
有效括号组合需满足:左括号必须以正确的顺序闭合。
示例:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
本题解用到的是回溯法,设定变量n,左括号open的数量小于n,当右括号close的数量小于左括号的时候可以加一个右括号。
答题思路紧抓一个要点,疯狂选括号,要么是左括号,要么是右括号。只要左括号有剩余就可以选,当剩下的右括号比左括号多时,才可以选右括号,否则就不能选。
代码如下:
#include<stdio.h>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
void backtrack(vector<string>& ans, string& cur, int open, int close, int n) {
if (cur.size() == n * 2) {
ans.push_back(cur);
return;
}
if (open < n) {
cur.push_back('(');
backtrack(ans, cur, open + 1, close, n);
cur.pop_back();
}
if (close < open) {
cur.push_back(')');
backtrack(ans, cur, open, close + 1, n);
cur.pop_back();
}
}
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
string current;
backtrack(result, current, 0, 0, n);
return result;
}
};
void main() {
int n = 3;
Solution S;
std::vector<std::string> result = S.generateParenthesis(n);
for ( int i = 0; i < result.size(); i++)
{
cout << result[i] << "\t" ;
//printf("%s\t", result[i].c_str());
}
}