スタックで括弧の対応を判定する

3 種類のかっこだけでできた文字列を見て、開きと閉じの対応が正しいかを返します。開いたかっこを積んでおき、閉じるたびに一番上と照らす、スタックの練習です。

海外で定番の問題リスト 4 本のうち 4 本に入っています (Blind 75、NeetCode 150、Grind 75、LeetCode Top Interview 150)

問題

( ) [ ] { } の 6 つの文字だけでできた文字列 s を受け取ります。開きかっこと閉じかっこの対応が正しければ true、正しくなければ false を返す関数を書いてください。

  • 対応が正しいとは、どの閉じかっこも、同じ種類で、まだ閉じていない一番新しい開きかっこを閉じていることです
  • 最後には、開いたままのかっこが残っていてはいけません
  • 空の文字列は、対応が正しいものとして true を返します
  • s の長さは 0 以上 10000 以下です

入力と出力の例

例 1

入れ子になっていても、内側から順に閉じていれば正しい対応です。

s = "{[()]}()"
true

例 2

数はそろっていても、閉じる順が違えば正しくありません。

s = "([)]"
false

例 3

開いたままのかっこが残っています。

s = "[{}"
false

面接での聞かれ方

面接では、短い一文で渡されることが多いです。

  • 「かっこだけの文字列があります。正しく閉じているか判定してください」
  • 最初は () の 1 種類だけで出され、解けたら「では 3 種類なら?」と広げられることがあります
  • 「空の文字列はどう扱いますか?」と、端の場合を聞かれることもあります

かっこ以外の文字が来るのか、空の文字列をどうするのかを、書く前に確かめておくと迷いません。

ヒント

まだ開いていません

付箋は 4 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3

  3. ヒント 4答えに近い

アルゴリズムのチートシートの「スタックとキュー」に、この型の要点を表とコードでまとめています。

スタックは後から入れた物を先に、キューは先に入れた物を先に取り出します。括弧の対応や、順番待ちの処理の形です。

main.py
def valid_brackets(s: str) -> bool:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(valid_brackets("{[()]}()"))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します