问题
给定一个正整数 n, 求输出符合期望的所有的 左右括号的组合。要求,左括号不小于右括号。当 n = 3 的时候,输出值为:
["((()))", "(()())", "(())()", "()(())", "()()()"]
分析
这是问题可以抽象成状态树:
* 节点: 在 x 的时候(0 <= x <=n), 此时的左右括号的个数为 (x, y)
* 边: (x,y) 到 (x +1, y) 或者 (x, y+1) 两个点的运算
* 约束条件: x >= y ; 当 x == y 时, (x , y +1 ) 不合法
* 起点和终点: (0, 0) -> (n, n)
因为本题需要得到“全部解”,所以使用深度搜索。
代码
##
#给定一个正数 n , 输出所有合法的左右括号的组合,比如 n = 3,
# ((())) ()()() (()())
##
def solution(n)
result = []
help(n, 0, 0, "", result)
end
def help(n, x, y, now, items)
if y == n
items << now
return
end
if x < n
help(n, x + 1, y, now + "(", items)
end
if x > y
help(n, x, y + 1, now + ")", items)
end
return items
end
p solution(3)
代码说明
- 结束条件是 y == n ,因为 x >= y , 所以当 y == n的时候,其实已经到了终点
- 优先考虑 x, 当 x < n 的时候,先增加左括号
- 但 x > y 的时候,增加右括号