方法一:暴力破解,遍历所有的结果,对所有结果进行判断。数据量大的话可能会超时。
var generateParenthesis = function(n) {
let arr = [];
function dp(n,idx,str){
if(idx===n){
if(juge(str)){
arr.push(str);
}
return;
}
dp(n,idx+1,`${str}(`);
dp(n,idx+1,`${str})`);
}
dp(n*2,0,'');
return arr;
};
function juge(str){
let stack = [];
for(let i=0;i<str.length;i++){
if(str[i]===')'){
if(stack.pop()!=="(")return false;
}else{
stack.push(str[i]);
}
}
if(stack.length!==0)return false;
return true;
}
方法二:回溯,其实方法一也算是回溯,但是方法一回溯了所有情况,而且每次返回的结果还要用栈来判断是否合法,但是方法二的回溯只回溯有效值。
var generateParenthesis = function(n) {
let arr = [];
function dp(left,right,str){
if(left===0&&right===0){
arr.push(str);
return;
}
if(left>0){
dp(left-1,right,`${str}(`);
}
if(right>left){
dp(left,right-1,`${str})`);
}
}
dp(n,n,'');
return arr;
};