一道经典的括号匹配笔面问题
来自新浪weibo @陈利人
问题:
左“{”,右”}"括号各N个,请打印出所有正确的组合,比如当N=3,{}{}{},{}{{}},等为正确的组合。如果写的代码是recursive,能否用iterative再写一个;反之亦然。
求好的算法描述. (不用使用循环和递归都做.一种即可.这个用递归更简单些)
py实现:
def foo(output, open, close, pairs): if open == pairs and close == pairs: print output else: if open<pairs: foo(output+'(', open+1, close, pairs) if close<open: foo(output+')', open, close+1, pairs) foo('', 0, 0, 3)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这个很容易就可以想到用回溯法来做。假设从左往右填括号。
状态包括:
(1) 填到第几个:int i
(2) 在右边最多还能填多少个 "}":int left
(3) 还剩多少个"{"可以填:int a
(4) 还剩多少个"}"可以填:int b
具体策略:
(1) 如果已经填完了,输出,返回(回溯)
(2) 如果还有"{"可以填:填进去,递归填下一个。
(3) 如果还可以填"}"并且还有"}"可以填:填进去,递归填下一个。
实现的代码附在后面。
至于转化成迭代的方式,任何递归都可以通过引入栈的方式来转化,只是写起来比较痛苦,看起来也比较痛苦就是了。