最初に、「バランスの取れた」括弧の文字列を、すべての「(」に対して、その「(」の後のどこかに一意の一致する「)」が 1 つあるような文字列として定義します。
たとえば、次の文字列はすべて「バランス」です。
()
()()
(())()
これらはそうではありませんが:
)(
())(
括弧の文字列 (長さ <= 1,000,000) と範囲クエリのリストが与えられた場合、<= 100,000 の各クエリの各範囲内でバランスの取れた括弧の最大長を見つけます (範囲に 0 インデックスを使用)
元:
()))()(())
範囲: [0,3] -> 最長 = 2 : "()"
範囲: [0, 4] -> 最長 = 2 : "()"
範囲: [5, 9] -> 最長 = 4: "(())"
私の考えは次のとおりです。
まず、スタックを維持することで、文字列が「バランスが取れている」かどうかを判断できます。「(」に遭遇した場合はスタックにプッシュし、「)」に遭遇した場合はスタックからポップアウトします。末尾に「(」が残っている場合、文字列は「バランスが取れていません」。
ただし、すべての範囲でこれを繰り返すのは O(N*M) の複雑さであり、入力のサイズに対して長すぎます。
ここで、範囲クエリに注目すると、プレフィックスの合計とバイナリ インデックス ツリー/セグメント ツリーが思い浮かびます。プレフィックスの合計範囲全体を配列に事前計算できる場合は、差をとることで、より小さなプレフィックスの合計を見つけることができます。これにより、大きな複雑さが得られます。
+1 の値を '(' に、-1 の値を ')' に割り当てて、'(' に遭遇するたびに累積合計に 1 を追加し、') に遭遇したときにその方法を考えました。 'あなたは減少します。したがって、次のような有効な「バランスのとれた」文字列の))()
場合: -1 -2 -1 -2
.
しかし、私の質問は、これをどのように使用して「バランスが取れている」かどうかを判断するのですか? また、特定の間隔内で最大の「バランスの取れた」文字列を見つける必要があるため、特定の部分文字列が「バランスが取れている」かどうかを確認する機能を使用して、その特定の間隔内で最大の文字列を見つけるにはどうすればよいでしょうか。