何旭东chucai的专栏

Web开发实录:Ruby, Rails, Java, Coffeescript , Sass, Html, JQuery

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

问题

给定一个正整数 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 的时候,增加右括号
阅读更多
文章标签: 数据结构 算法
个人分类: ruby 算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭