我试图用括号序列解决相当复杂的问题,只有'('和')',实际上我需要实现在对数时间内的段树将检查括号序列是否有效。
括号的有效序列是一个字符串:
现在有了这些条件,我需要实现分段树,查询将检查范围[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)中检查这个
提前致谢。
答案 0 :(得分:0)
让所有(
等于+1,所有)
等于-1。现在运行括号字符串并通过累加括号的值(+ 1 / -1)创建一个新数组。像这样:
( ) ( ( ( ) ) ) ( ( ) )
1 0 1 2 3 2 1 0 1 2 1 0
现在,如果某些[i,j]
是有效序列,那么对于每个x
,i<=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。再次,检查( == )
。