假设你考虑长度为六个字符串的情况,顺序为:“()()()”,“()(())”,“(())()”,“(( )())“,”((()))“。
在上面的例子中,如果我们看到第一个左括号被关闭的字符串最早出现,如果两个字符串相同,则该规则被递归地应用于下一个左括号。
如果给出特定的平衡括号序列如何查找订单号?假设()(()) - >输出为2 ....在O(n)中,n是平衡括号的长度,即在上述情况下为3 ......输入可以是大约100000个平衡括号
答案 0 :(得分:1)
首先,g(n,k)
为2n + k
个字符串的长度n
个字符串,其中包含k
个平衡括号,这些括号会更多g(n,k)
个括号。我们可以计算g(0,k) = 1
吗?
让我们试试递归。为此,我们首先需要一个基本案例。很明显,如果没有平衡的括号,那么我们只能有一种可能性 - 只有括号括起来。所以g(n-1,k+1)
。有我们的基本情况。
接下来的递归案例。第一个字符是左括号或右括号。如果它是一个左括号,那么有g(n,k-1)
个方法可以完成。如果它是一个右括号,那么有g(0,k) = 1
个方法可以完成。但我们的开放数量不能为负数
g(n,-1) = 0
g(n,k) = g(n-1, k+1)
g
这让我们可以计算g(n, k)
但效率不高 - 我们实际上会列出递归调用中的每个可能的字符串。然而,有一个技巧,记住结果。这意味着,每当您致电n
时,请查看您之前是否曾致电过,以及您是否刚刚回复该答案。否则,您计算答案,缓存它,然后返回它。 (有关此技巧和备用策略的更多信息,请查看动态编程。)
好的,现在我们可以生成相关内容的计数,但是我们如何使用它来获得答案呢?
请注意以下内容。假设你的字符串中途有一个开括号,在逻辑上可能是一个紧密的括号。假设此时需要k
个括号对并且g(n, k-1)
打开括号。然后有g(n, k-1)
个可能的字符串,直到那时与你的字符串相同,然后在那里有一个紧密的括号(所以它们在你的之前),然后做任何事情。因此,在所有的近括号上求{{1}}可以得到你之前的字符串数。添加一个可以为您提供职位。
答案 1 :(得分:0)
我从罗斯基的论文中得到了答案。该算法规定了排名&没有二叉树。
http://webhome.cs.uvic.ca/~ruskey/Publications/Thesis/ThesisPage16.png