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

Algorithm 查询以检查括号序列是否有效,algorithm,validation,brackets,Algorithm,Validation,Brackets,我试图用括号序列来解决相当复杂的问题,只有“('和')”,实际上我需要实现段树,在对数时间内检查括号序列是否有效 括号的有效序列是一个字符串,它是: 空字符串 一个字符串(B),其中B是有效的括号序列 LR,两个字符串L和R的浓度,它们都是有效的括号序列 现在有了这些条件,我需要实现段树,对于查询,它将检查范围[A,B]是否是有效的括号序列 实际上,我在程序中需要的是索引K,使得K使所有(等于+1,所有)等于-1。现在,遍历括号字符串,通过累计添加括号(+1/-1)的值,从中创建一个新数组。

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

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

  • 空字符串
  • 一个字符串(B),其中B是有效的括号序列
  • LR,两个字符串L和R的浓度,它们都是有效的括号序列
现在有了这些条件,我需要实现段树,对于查询,它将检查范围[A,B]是否是有效的括号序列

实际上,我在程序中需要的是索引K,使得K使所有
等于+1,所有
等于-1。现在,遍历括号字符串,通过累计添加括号(+1/-1)的值,从中创建一个新数组。像这样:

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

现在,如果一些
[i,j]
是一个有效的序列,那么对于每个
x
,你可以做一些预处理,比如首先找到长度为2的子串是有效的,然后检查长度为3的子串是有效的(这将是无的),然后长度为4的序列是有效的,等等。。。。直到绳子的长度。这个预处理需要O(n^2)的时间复杂度和空间,而查询需要O(1)的时间复杂度。但是我忘了在帖子中提到字符串的长度将达到10^5,所以我们不能在O(n^2)中进行预处理,那么我的方法将不起作用。所以更正式地说,你说我们应该为每个节点保留两个值,最小值和总和,如果查询的最小值-总和小于0,则序列无效。我说得对吗?如果
sum
是初始累积和数组(前缀sum),则从该
sum
数组中创建最小范围段树。然后,对于任何查询
[i,j]
,使用树查找最小值,然后从该最小值中删除
sum[i-1]
。如果这个最终值小于零,答案是否定的。还要检查
sum[j]-sum[i-1]==0
,这确保了该段中的开括号与闭括号相同。我只是尝试对解决方案进行编码,我认为最小值总是-1或1,因为数组只包含-1和1s,让我们考虑这个例子吗?也让我们考虑这个例子:(())和(查询)=(0,n-1),其中n是字符串的长度,对于这个查询min值=1,总和=0,-1 - 0<0,所以它是错误的,在我的段树中,对于<代码>(())(?)/代码,我应该改变什么,和数组是<代码> 1 2 1 0 1 0 < /代码>。最小值为0。由于查询从字符串的开头开始,因此这是最终值。0>=0,因此第一次检查为true。