数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
有效括号组合需满足:左括号必须以正确的顺序闭合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
提示:
1 <= n <= 8
思路:
首先可以采取最暴力的方法,有一个用来检验括号匹配的函数,一个工作函数(恕我没有啥取名字的天分),在里面依次加入(和),不断推入字符串然后进行往下循环,在本次循环结束的时候再pop弹出开始下一个组合,最后全部循环完以后再根据判断函数来判断是否符合括号进行输出;
在上面这种方法基础上可以进行优化,使用回朔法来进行化简。要想满足括号匹配的条件,第一是要保证(的数量小于n,同时还要保持)的数量小于(的数量,因为如果)多于(那么就必会存在不符合条件的括号了,所以只有满足条件时我们才进行+括号然后进行递归回朔。
代码区1:
class Solution {
public:
vector<string> res;
string str;
bool judge(string s){
int balance=0;
for(int i=0;i<s.length();i++){
if(s[i]=='(')
balance++;
else if(s[i]==')')
balance--;
if(balance<0)
return false;
}
return balance==0;
}
void work(int d,int n,string str){
if(d==n){
if(judge(str))
res.push_back(str);
return;
}
str+='(';
work(d+1,n,str);
str.pop_back();
str+=')';
work(d+1,n,str);
str.pop_back();
}
vector<string> generateParenthesis(int n) {
work(0,2*n,str);
return res;
}
};
代码区2:
class Solution {
public:
vector<string> res;//字符串容器用来存放结果res
string s;
void work(vector<string>&res,string s,int close,int open,int n){
if(s.length()==n*2){//当s的长度为n的两倍时说明括号已经全部齐了
res.push_back(s);//将s推入到res中
return;
}
if(open<n){//当左括号的数量小于n的时候往s中加(然后进行递归
s.push_back('(');
work(res,s,close,open+1,n);
s.pop_back();//最后再将插入的(弹出进行下一次循环
}
if(close<open){
s.push_back(')');
work(res,s,close+1,open,n);
s.pop_back();
}
}
vector<string> generateParenthesis(int n) {
work(res,s,0,0,n);//开始进行,都从0开始
return res;
}
};
新手上路,有错请指正;