Official
A - 括弧の深さ / Depth of Parentheses Editorial by admin
GPT 5.2 High概要
正しく対応のとれた括弧列 \(S\) について、左から順に見たときの「同時に開いている括弧の最大数」を求めれば、それが入れ子の最大の深さになります。
考察
括弧列の「深さ」とは、ある位置で何個の ( がまだ閉じられていないか(何段階入れ子になっているか)で決まります。
例えば ((())) を左から見ると、
- 1文字目
(:深さ \(1\) - 2文字目
(:深さ \(2\) - 3文字目
(:深さ \(3\)(最大) - その後
)で深さが \(2,1,0\) と戻る
となり、最大深さは \(3\) です。
素朴に「各括弧がどの括弧に対応するか」を毎回探したり、部分文字列を作って解析したりすると、最悪で \(O(|S|^2)\) になり \(|S| \le 10^6\) では間に合いません。
しかしこの問題は対応関係そのものは不要で、「いま何段開いているか」だけ分かれば十分なので、1回の走査で解けます。
アルゴリズム
- 変数
curを「現在の深さ(開き括弧の未処理数)」として \(0\) で初期化する。 - 変数
mxを「最大深さ」として \(0\) で初期化する。 - 文字列を左から順に見て、
- 文字が
(ならcur += 1(深くなる)し、mx = max(mx, cur)で最大を更新する。 - 文字が
)ならcur -= 1(一段戻る)とする。
- 文字が
- 最後に
mxを出力する。
入力は正しい括弧列であることが保証されているため、途中で cur が負になることや、最後に \(0\) にならないことは起きません(ただし実装ではその保証を前提にしてOKです)。
計算量
- 時間計算量: \(O(|S|)\)(1回の走査)
- 空間計算量: \(O(1)\)(カウンタ2つだけ)
実装のポイント
\(|S|\) が最大 \(10^6\) なので、Pythonでは
sys.stdin.buffer.read()のように高速入力を使うと安心です。最大深さは
(を読んだ直後のcurが候補になるので、そのタイミングでmxを更新します。ソースコード
import sys
def main():
s = sys.stdin.buffer.read().strip().decode()
cur = 0
mx = 0
for ch in s:
if ch == '(':
cur += 1
if cur > mx:
mx = cur
else:
cur -= 1
print(mx)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
posted:
last update: