leetcode 22 生成括号

leetcode 22 生成括号
 
/*
当n=1时 ()

当n=2时 ()() (())


当n=3时
[
"()(())",
"()()()"
"(())()",
"(()())",
"((()))",
]

思路:找规律:

 

任何一个括号序列都一定是由 ( 开头,并且第一个 ( 一定有一个唯一与之对应的 )。这样一来,每一个括号序列可以用 (a)b 来表示,其中 a 与 b 分别是一个合法的括号序列(可以为空)。

 

n = 0
''

n = 1
() 相当于 ( 里面n=0 )

n = 2

()() 相当于 ( 里面n=0 ) 右n=1
(()) 相当于 ( 里面n=1 )


n = 3

() (()) 相当于 ( 里面n=0 ) 右n=2
() ()() 相当于 ( 里面n=0 ) 右n=2

(()) () 相当于 ( 里面n=1 ) 右n=1

( ()() ) 相当于 ( 里面n=2 )
( (()) ) 相当于 ( 里面n=2 )
*/

function generateParenthesis(n) {

if (n === 0) {
return ['']
}

const result = []

for (let i = 0; i <= n - 1; i++) {
let left = generateParenthesis(i)
let right = generateParenthesis(n - i - 1)
left.forEach((itemLeft) => {
right.forEach((itemRight) => {
result.push(`(${itemLeft})${itemRight}`)
})
})
}

return result
}



const r = generateParenthesis(3)
console.log(r);
 
 
============================================================
 
// iteration(使用迭代)
var generateParenthesis = function(n) {

const results = [[''], ['()']]

for (let i = 2; i <= n; i++) {

const result = []
 
for (let j = 0; j <= i - 1; j++) {
const leftInner = results[j]
const right = results[i - j -1]
leftInner.forEach((itemLeft) => {
right.forEach((itemRight) => {
result.push(`(${itemLeft})${itemRight}`)
})
})
}
results[i] = result
}

return results[n]

};
 
 
=================================================
 
回溯法

var generateParenthsis = function (n) {
let list = []
function generate(left, right, s) {
if (left === n && right === n) {
list.push(s)
return
}
// 生成左括号的条件应该是 left的数量 小于n
if (left < n) {
generate(left + 1, right, s + '(')
}
// 生成右括号的条件应该是 left的数量大于right的数量 () ((()
if (left > right) {
generate(left, right + 1, s + ')')
}
}
generate(0, 0, '')
return list
}

const r = generateParenthsis(3)
console.log(r);
posted @ 2020-07-10 15:04  hh9515  阅读(129)  评论(0)    收藏  举报