Official
A - 括弧の深さ / Depth of Parentheses Editorial by admin Editorial for printing
Qwen3-Coder-480B概要
与えられた正しい括弧列に対して、括弧の入れ子の最大の深さを求めます。
考察
この問題では、括弧の深さを管理しながら文字列を左から右に見ていき、最大の深さを記録すれば良いです。
(が現れると深さが1増える)が現れると深さが1減る
これはスタックのような動作ですが、実際には深さを数値で管理するだけで十分です。各 ( に対して対応する ) が必ず存在することが保証されているため、深さが負になることはありません。
素朴な方法として、再帰的に括弧の深さを調べるなどが考えられますが、文字列の長さが最大 \(10^6\) あるため、再帰はスタックオーバーフローのリスクがあります。また、毎回部分文字列を切り出すような処理を行うと、時間計算量が大きくなります。
この問題では、1パスで深さを更新していく線形時間のアルゴリズムが最適です。
例えば、文字列 (()(())) を見てみましょう:
| 文字 | 深さ | 最大深さ |
|---|---|---|
| ( | 1 | 1 |
| ( | 2 | 2 |
| ) | 1 | 2 |
| ( | 2 | 2 |
| ( | 3 | 3 |
| ) | 2 | 3 |
| ) | 1 | 3 |
| ) | 0 | 3 |
このように、各文字に対して深さを更新していけば、最終的に最大の深さが求められます。
アルゴリズム
- 変数
depthを現在の深さ、max_depthをこれまでの最大深さとして保持します。 - 文字列を左から右に走査します:
(ならdepthを1増やし、max_depthを更新します(必要なら))ならdepthを1減らします
- 走査終了後、
max_depthを出力します
計算量
- 時間計算量: \(O(|S|)\)
- 空間計算量: \(O(1)\)
実装のポイント
各文字に対して一度だけ処理を行うため、非常に効率的です
入力文字列の前後の空白を取り除くために
.strip()を使うと安全ですmax_depthは(のときだけチェックすれば十分です()では減少するだけなので最大値は更新されない)ソースコード
s = input().strip()
depth = 0
max_depth = 0
for char in s:
if char == '(':
depth += 1
max_depth = max(max_depth, depth)
elif char == ')':
depth -= 1
print(max_depth)
この解説は qwen3-coder-480b によって生成されました。
posted:
last update: