数の幅を持ち歩いて星入りの括弧を判定する

貪欲法問題 169

開きかっこ、閉じかっこ、どちらにも空にもなれる星の 3 つの文字だけの文字列が、正しいかっこの並びにできるかを返す。開いたままのかっこの数がとりうる最小と最大の 2 つだけを持てば、前から 1 回なめて判定できます。

海外で定番の問題リスト 4 本には入っていません

問題

( と ) と * の 3 つの文字だけでできた文字列 s を受け取ります。* は、(、)、空の文字列のどれか 1 つに好きに置き換えられます。* をうまく置き換えて、開きかっこと閉じかっこの対応が正しい並びにできるなら true、どう置き換えてもできないなら false を返す関数を書いてください。

  • 対応が正しいとは、どの ) も、それより前にあるまだ閉じていない ( を 1 つ閉じていて、最後に閉じていない ( が残っていないことです
  • * はそれぞれ別々に置き換え方を選べます
  • 空の文字列は、対応が正しいものと見ます
  • s の長さは 1 以上 100 以下です

入力と出力の例

例 1

2 文字目の * を ) にすると ()() になり、対応が正しくなります。

s = "(*()"
true

例 2

* を ( にしても、閉じかっこが 2 つあるので 1 つ余ります。

s = "*))"
false

例 3

開きかっこが 2 つあるのに、閉じに使える文字は * の 1 つだけです。

s = "((*"
false

面接での聞かれ方

面接では、かっこの対応を判定する問題の続きとして出されることが多いです。

  • 「かっこの文字列に、どれにでもなれる文字が混ざっています。正しい並びにできますか」
  • 最初にスタックを 2 つ使う書き方や、動的計画法で書き、「記憶を O(1) にできますか」と聞かれる流れもあります
  • 「* は空にもなれますか」と聞くと、「なれます」と返ってくるのがふつうです

* が空になれるかで、答えが変わります。書く前に確かめておきます。

ヒント

まだ開いていません

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

  1. ヒント 2

  2. ヒント 3答えに近い

アルゴリズムのチートシートの「配列と文字列」に、この型の要点を表とコードでまとめています。

配列と文字列の問題は、全部の組を調べると手間が大きくなる所を、窓や左右の添字で減らす形が多いです。

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

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

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

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


# 「実行」を押すと、この行の結果が出ます
print(star_brackets("(*()"))

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