暴力法:
先将n个(
和n个)
全排列,生成a 2n个不同组合,再进行判断是否构成有效括号。
lc有类似的判断括号是否有效的题。(lc 20)
时间复杂度On
空间复杂度On
回溯法:
dfs函数携带三个参数(左括号剩余,右括号剩余,和当前字符串)
当字符串长度满足需求时压入结果数组
为了让括号生成出来即有效(不必再次判断结果字符串是否有效)
则需要满足两个条件
- 有左括号剩余优先左括号。
- 右括号只有在数量大于左括号时才使用右括号。
tip:字符串回溯,不需要像数组一样复制和增删操作。
隐式回溯,字符串保留了选择之前的状态,相当于隐式地删掉了字符。
其实是 str 没变,还是之前的状态,只不过给下一级的时候,加了括号,同层的不变。
时间复杂度On
空间复杂度On
代码如下:
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function(n) {
let res= [];
function dfs(leftnum,rightnum,str){
if(str.length==2*n){
res.push(str);
return;
}
if(leftnum>0){
dfs(leftnum-1,rightnum,str+'(')
}
if(rightnum>leftnum){
dfs(leftnum,rightnum-1,str+=')')
}
}
dfs(n,n,"");
return res;
};