【问题标题】:Closure Number Method for Generate Parenthesis Problem生成括号问题的闭包数法
【发布时间】:2019-06-06 10:12:16
【问题描述】:

Leetcode 上的标准 Generate Parenthesis 题如下

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

在解决方案选项卡中,他们解释了Closure Number Method,我觉得很难理解。

我对代码进行了试运行,甚至得到了正确答案,但似乎无法理解它为什么起作用?这种方法背后的直觉是什么?

任何帮助将不胜感激!

【问题讨论】:

  • 如果我有时间我会回答这个问题,但是如果你用谷歌搜索Catalan Number 并开始阅读你可能会找到一些帮助。加泰罗尼亚数字也与Motzkin Numbers 有关。
  • Code Golf 这些概念很有趣。这是我创建的与 Motzkin 数字相关的一个 - Enumerate binary trees
  • 感兴趣的:Catalan Numbers Tom Davis
  • 我添加了加泰罗尼亚语tag。标签中有很多不错的链接。
  • @Guy Coder 非常感谢!我会看看这些概念。

标签: algorithm catalan


【解决方案1】:

这个算法的基本思想是动态规划。因此,您尝试将您的问题分解为易于解决的小问题。在此示例中,您使子问题变得非常小,以至于解决方案是空字符串(如果大小为 0)或解决方案是“()”(对于大小 1)。

你开始使用这样的知识,如果你想要给定长度的括号,那么第一个字符需要是“(”,并且在字符串的某个后面的位置需要这个字符:“)”。否则输出无效。

现在您不知道右括号的位置,所以您只需尝试每个位置(第一个 for 循环)。

您知道的第二件事是,在左括号和右括号之间以及在右括号之后必须有一些东西,您并不真正知道它的外观(因为有很多可能性),但它 必须再次成为有效的括号对。

现在这个问题只是你已经解决的问题。因此,您只需输入有效括号的所有可能性(使用较小的输入大小)。因为这正是您的算法已经完成的工作,所以您可以使用递归函数调用来执行此操作。

总结:你知道问题的一部分,而其余的问题只是规模较小的同一个问题。所以你解决了你知道的问题的一小部分,然后递归地调用相同的方法来解决剩下的问题。之后,您只需将它们放在一起并得到您的解决方案。

动态编程通常不是那么容易理解,但非常强大。因此,如果您不直接了解它,请不要担心。解决此类难题是学习动态编程的最佳方式。

【讨论】:

    【解决方案2】:

    一个序列的闭包数,大小为该序列的最小前缀,它本身就是一个有效的序列。 如果一个序列的闭包数为 k,那么您知道在索引 0 中有 '(' 并且在索引 k 中有 ')' 该方法通过检查此类前缀的所有可能大小来解决问题,对于每个大小,它将序列分解为前缀(删除 0 和 k 元素)和序列的所有其余部分,并递归解决两个子问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      相关资源
      最近更新 更多