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

来源:互联网 发布:马桶品牌知乎 编辑:程序博客网 时间:2024/06/06 20:33

问题

给定一个正整数 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)enddef 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 itemsendp solution(3)

代码说明

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