平衡括号订单号

时间:2014-10-23 11:27:06

标签: algorithm data-structures tree puzzle

假设你考虑长度为六个字符串的情况,顺序为:“()()()”,“()(())”,“(())()”,“(( )())“,”((()))“。
在上面的例子中,如果我们看到第一个左括号被关闭的字符串最早出现,如果两个字符串相同,则该规则被递归地应用于下一个左括号。

如果给出特定的平衡括号序列如何查找订单号?假设()(()) - >输出为2 ....在O(n)中,n是平衡括号的长度,即在上述情况下为3 ......输入可以是大约100000个平衡括号

2 个答案:

答案 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个方法可以完成。但我们的开放数量不能为负数

  1. g(n,-1) = 0
  2. g(n,k) = g(n-1, k+1)
  3. g
  4. 这让我们可以计算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