数字
n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1 输出:["()"]
提示:
1 <= n <= 8
看到有的大佬用的DP,自己实在这方面欠缺太多,数据也不大直接搜,2^16次方,每个位置有‘(’和‘)’两种情况,最后判断,当然也可以剪枝,后面也附上了。
class Solution {
vector<string> out;
public:
int pd(string str){
int cnt = 0;
for(int i = 0;i < str.size();i++){
if(str[i] == '(') cnt++;
else{
cnt--;
if(cnt < 0) return 0;
}
}
if(cnt == 0) return 1;
return 0;
}
void dfs(int index,string str,int n){
if(index == n-1){
if(pd(str)) out.push_back(str);
return ;
}
dfs(index+1,str+"(",n);
dfs(index+1,str+")",n);
}
vector<string> generateParenthesis(int n) {
dfs(0,"(",2*n);
return out;
}
};
剪枝就是去除一定不可能的条件,也就是右括号出现的次数大于左括号,或者剩余的位置不够和左括号匹配直接可以结束。
class Solution {
vector<string> out;
public:
// int pd(string str){
// int cnt = 0;
// for(int i = 0;i < str.size();i++){
// if(str[i] == '(') cnt++;
// else{
// cnt--;
// if(cnt < 0) return 0;
// }
// }
// if(cnt == 0) return 1;
// return 0;
// }
void dfs(int index,string str,int n,int cnt){
if(cnt<0||cnt>=n-index) return ;
if(index == n-1){
// if(pd(str)) out.push_back(str);
out.push_back(str);
return ;
}
dfs(index+1,str+"(",n,cnt+1);
dfs(index+1,str+")",n,cnt-1);
}
vector<string> generateParenthesis(int n) {
dfs(0,"(",2*n,1);
return out;
}
};