查询以检查括号序列是否有效

时间:2017-06-14 05:35:49

标签: algorithm validation brackets

我试图用括号序列解决相当复杂的问题,只有'('和')',实际上我需要实现在对数时间内的段树将检查括号序列是否有效。

括号的有效序列是一个字符串:

  • 空字符串
  • 字符串(B),其中B是有效的括号序列
  • LR,两个字符串L和R的浓度,它们都是括号的有效序列。

现在有了这些条件,我需要实现分段树,查询将检查范围[A,B]是否是有效的括号序列。

实际上我在程序中需要的是索引K,使得K <= B且序列[A,K]是括号的有效序列,K是最大可能的,但我认为我无法实现给我索引K,所以我想我会尝试实现只检查序列是否有效的分段树。

示例

sequence =&#34;()((()))(())&#34; query_1 = [1,2],查询1的答案为真,因为序列&#34;()&#34;已验证。 query_2 = [1,6] =&#34;()((()&#34;此序列无效且查询应返回false;

我尝试了什么

我用堆栈实现检查,检查括号序列是否有效,但该检查在O(N)中有效,我认为我们可以在O(logN)中检查这个

提前致谢。

1 个答案:

答案 0 :(得分:0)

让所有(等于+1,所有)等于-1。现在运行括号字符串并通过累加括号的值(+ 1 / -1)创建一个新数组。像这样:

( ) ( ( ( ) ) ) ( ( ) )
1 0 1 2 3 2 1 0 1 2 1 0

现在,如果某些[i,j]是有效序列,那么对于每个xi<=x<=j[i,x]应该包含比封闭括号更多的开括号( )。如果())是一个细分,它的最终值将是(1)+( - 1)+( - 1)= -1,这是负数。这意味着细分中)的数量大于(的数量。这在有效序列中是不可能的。类似地,对于段())((),尽管段的最终总和将为零,但索引3处的总和(1索引)将为-1。所以这将是无效的。

因此,对于任何查询[i,j],我们只需检查 段中是否存在任何点x,以便sum([i,x]) <= 0。如果是,则返回false。另请检查(的数量是否等于)的数量。

为此,维护sum数组的最小范围查询段树。找到范围[i,j]中的最小值。 (称val)。如果val - sum[i-1] < 0返回false。再次,检查( == )