有关Leetcode的标准“生成括号”问题如下
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,但我很难理解。
我试运行了这些代码,甚至得到了正确的答案,但似乎无法理解它为什么起作用?这种方法的直觉是什么?
任何帮助将不胜感激!
答案 0 :(得分:1)
该算法的基本思想是动态编程。因此,您尝试将问题分为易于解决的较小问题。在此示例中,您将子问题设置得很小,以至于解决方案要么是一个空字符串(如果大小为0),要么解决方案是“()”(对于大小1)。
您开始使用以下知识:如果要给定长度的括号,则第一个字符必须为“(”,而在字符串的某些后面,则必须为该字符:“)” < / strong>。否则输出无效。
现在您不知道右括号的位置,因此只需尝试每个位置(第一个for循环)。
您知道的第二件事是,在左括号和右括号之间以及在右括号之后必须有某些内容,您并不真正知道它的外观(因为有很多可能性),但是它< strong>必须再次成为有效的括号对。
现在,这个问题是您已经解决的问题。因此,您只需输入有效括号的所有可能性(使用较小的输入大小)。因为这正是您的算法已经完成的工作,所以您可以使用递归函数调用来做到这一点。
如此总结:您知道问题的一部分,而其余问题与尺寸较小的相同。因此,您可以解决已知问题的一小部分,然后递归调用相同的方法来解决其余问题。然后,您将所有内容放到一起并得到解决方案。
动态编程通常不那么容易理解,但功能非常强大。因此,如果您不直接理解它,请不要担心。解决此类难题是学习动态编程的最佳方法。
答案 1 :(得分:1)
序列的闭合编号,其长度为序列的最小前缀,该序列本身就是有效序列。 如果一个序列的闭数为k,那么您将知道索引0中有'(',索引k中有')'。 该方法通过检查该前缀的所有可能大小来解决该问题,对于每个前缀,它都会将序列分解为前缀(除去0和k元素),并破坏序列的所有其余部分,然后递归解决两个子问题。