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

原创 2016年03月10日 11:29:13

问题

给定一个正整数 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 的时候,增加右括号
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

南邮数据结构、算法实践周提高题3(图的连通问题和二叉排序树)

Problem 3 Graph and Tree (Difficulty index ★★★★☆) 3-1. A graph is a set of nodes connected in vario...

数据结构与算法面试复习(一):二叉树遍历问题

数据结构二叉树遍历(递归和非递归实现)

【算法设计与数据结构】URAL 1152.False Mirrors(状态压缩dp+dfs)

题目链接http://acm.timus.ru/problem.aspx?space=1&num=1152题目大意n个阳台(3<=n<=20)围成一个圈,每个阳台里有若干只怪兽(1~100)。中间有一...

问题 H: 数据结构(C语言版)算法6.1至算法6.4__二叉树遍历

问题 H: 数据结构(C语言版)算法6.1至算法6.4__二叉树遍历 时间限制: 1 Sec  内存限制: 128 MB 提交: 128  解决: 34 [提交][状态][讨论版] 题目描述 ...

左程云_算法与数据结构 — 链表问题 — 03删除链表的中间节点和a/b处的节点

问题描述给定链表的头节点head,实现删除链表的中间节点的方法; 若为偶数个:比如1234则删除节点2; 给定链表的头节点head,实现删除链表的a/b处节点的方法;思路分析删除中间节点1个节点,...

数据结构与算法分析笔记与总结(java实现)--链表18:有环单链表判断是否相交问题

数据结构与算法分析笔记与总结(java实现)--链表18:有环单链表判断是否相交问题
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)