[数据结构和算法]状态树的问题

时间:2021-04-09 11:57:24

问题

给定一个正整数 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)

代码说明

  1. 结束条件是 y == n ,因为 x >= y , 所以当 y == n的时候,其实已经到了终点
  2. 优先考虑 x, 当 x < n 的时候,先增加左括号
  3. 但 x > y 的时候,增加右括号