题目
这道题有两种写法,分别是用dfs和bfs来解决。
DFS写法
先说说dfs写法吧,整体是使用递归来编写。
思路:
- 只要还有左括号就可以使用左括号
- 只要右括号数量大于左括号就可以使用右括号
- 只要字符串长度等于2n就存入数组
代码
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function(n) {
let res = []
const dfs = (l, r, str) => {
console.log(l, r, str);
console.log(str.length)
if(str.length == 2 * n) {
res.push(str)
return
}
if(l > 0) {
dfs(l - 1, r, str + '(')
}
if(r > l) {
dfs(l, r - 1, str + ')')
}
}
dfs(n, n, '')
return res
};
BFS写法
BFS写法用到了Set对象,set对象数据结构和数组比较相似,但是set对象里不能有重复的元素,如果你添加了重复的元素,set对象会自动帮你去重。
思路
- 当 n = 1 时,结果为 ["()"]
- 当 n = 2 时, 我们可以往 n = 1 时的结果里不同的位置插入“()”,可以得出结果["()()", "(())", "()()"],去重后的结果是["()()", "(())"]
- 以此类推
代码
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function(n) {
let set = new Set(['()'])
let newSet
for(let i = 2; i <= n; i++) {
newSet = new Set()
for(let s of set) {
for(let j = 0; j < s.length; j++) {
newSet.add(s.slice(0, j) + '()' + s.slice(j))
}
}
set = newSet
}
return [...set]
};