首先,将一串“平衡”括号定义为一个字符串,这样对于每个“(”,在该“(”之后的某处都有一个唯一的匹配的“)”。
例如,以下字符串都是“平衡的”:
()
()()
(())()
虽然这些不是:
)(
())(
给定一个括号字符串(长度 <= 1,000,000)和一个范围查询列表,找到每个 <= 100,000 个查询的每个范围内平衡括号的最大长度(对范围使用 0 索引)
前任:
()))()(())
范围:[0,3] -> 最长 = 2:“()”
范围:[0, 4] -> 最长 = 2:“()”
范围:[5, 9] -> 最长 = 4:“(())”
我的想法如下:
首先,只要确定一个字符串是否“平衡”就可以通过维护一个堆栈来完成。如果遇到'(',则压入堆栈,遇到')',则从堆栈中弹出。如果最后有任何 '(' 仍然存在,则字符串不是“平衡的”。
但是,对所有范围重复此操作是 O(N*M) 复杂度,这对于输入的大小来说太长了。
现在,在注意到范围查询时,会想到前缀和和二叉索引树/段树。如果您可以将整个前缀和范围预先计算到一个数组中,那么您可以通过取差来找到更小的前缀和,这将具有良好的 big-o 复杂性。
我的想法是给'('分配一个+1值,给')'分配一个-1值,这样每次你遇到'('你加一个到累积和当你遇到') '你减少了。因此,对于一个有效的“平衡”字符串,))()
你会得到:-1 -2 -1 -2
.
但是,我的问题是您如何使用它来确定它是否“平衡”?此外,因为您需要在给定间隔内找到最大的“平衡”字符串,所以如何使用检查给定子字符串是否“平衡”的能力来找到该给定间隔内的最大字符串。