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

2 篇文章 0 订阅

问题

给定一个正整数 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 的时候,增加右括号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值