Во-первых, определите строку «сбалансированных» круглых скобок как строку, такую, что для каждого '(' есть один уникальный, соответствующий ')' где-то после этого '('.
Например, все следующие строки «сбалансированы»:
()
()()
(())()
пока это не:
)(
())(
Учитывая строку скобок (длина ‹= 1 000 000) и список запросов диапазона, найдите максимальную длину сбалансированных скобок в каждом из диапазонов для каждого из ‹ = 100 000 запросов (используя 0-индексацию для диапазонов)
Ex:
()))()(())
Диапазон: [0,3] -> Самый длинный = 2: "()"
Диапазон: [0, 4] -> Самый длинный = 2: "()"
Диапазон: [5, 9] -> Самое длинное = 4: "(())"
Мои мысли таковы:
Во-первых, можно просто определить, является ли строка «сбалансированной», поддерживая стек. Если вы встретите '(', поместите в стек, а когда встретите ')', вытащите его из стека. Если в конце остается '(', то строка не "сбалансирована".
Однако повторение этого для всех диапазонов - это сложность O (N * M), которая слишком велика для размера входных данных.
Теперь, заметив запросы диапазона, на ум приходят суммы префиксов и двоичные индексированные деревья/деревья сегментов. Если вы можете предварительно вычислить весь диапазон сумм префиксов в массив, то вы можете найти меньшие суммы префиксов, взяв разницу, которая будет иметь хорошую сложность big-o.
У меня была идея присвоить значение +1 '(' и значение -1 ')', чтобы каждый раз, когда вы сталкиваетесь с '(', вы добавляли единицу к совокупной сумме, а когда вы сталкиваетесь с ') ' вы уменьшаете. Таким образом, для действительной «сбалансированной» строки, такой как ))()
, вы получите: -1 -2 -1 -2
.
Однако мой вопрос: как вы используете это, чтобы определить, является ли он «сбалансированным»? Кроме того, поскольку вам нужно найти наибольшую «сбалансированную» строку в заданном интервале, как вы используете возможность проверить, является ли данная подстрока «сбалансированной», чтобы найти эту наибольшую в данном интервале.