スライディングウィンドウで k 枚まで塗り替えて同じ色の最長の並びを作る

色を英大文字で表したタイルの並びで、k 枚まで塗り替えてよいとき、同じ色が続く並びを最も長くします。窓の長さから最も多い色の数を引いた数が k 以下、を保つスライディングウィンドウの練習です。

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

問題

壁に 1 列に貼ったタイルの色を、英大文字の文字列 s で受け取ります。s[i] が左から i 番目のタイルの色です。タイルは多くて k 枚まで、好きな色に塗り替えられます。

塗り替えたあと、同じ色のタイルが途切れずに続く部分を、最も長くて何枚にできるかを返す関数を書いてください。

  • 塗り替える色は、英大文字のどれでもかまいません。塗り替えは k 枚より少なくてもかまいません
  • s の長さは 1 以上 100000 以下で、A から Z の英大文字だけでできています
  • k は 0 以上、s の長さ以下です

入力と出力の例

例 1

左から 3 枚目から最後までの "GRGGGR" は、G が 4 枚、R が 2 枚です。R の 2 枚を G に塗れば、G が 6 枚続きます。

s = "RRGRGGGR" k = 2
6

例 2

塗り替えられません。もとから続いている最後の "XX" の 2 枚がいちばん長い並びです。

s = "XYZXX" k = 0
2

例 3

4 枚とも色が違いますが、4 枚まで塗り替えられるので、全部を同じ色にできます。

s = "ABCD" k = 4
4

面接での聞かれ方

面接では、文字列の言葉で渡されることがよくあります。

  • 「k 文字まで置き換えて、同じ文字が続く最長の部分文字列の長さを求めてください」
  • 「置き換える先の文字は、何でもいいですか?」と、範囲を自分から確かめるかを見られます
  • 書き終えたあとに「最も多い文字の数を、窓が縮むときに減らさなくていいのはなぜですか?」と聞かれることもあります

窓の中で「どの色にそろえるか」を考えると迷いますが、いちばん多い色にそろえるのが最も塗り替えが少ない、と気づけば、条件は 1 つの式になります。

ヒント

まだ開いていません

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

  1. ヒント 2

  2. ヒント 3

  3. ヒント 4答えに近い

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

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

main.py
def longest_repaint(s: str, k: int) -> int:
    """
    Goal: 何を返すか

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

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

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


# 「実行」を押すと、この行の結果が出ます
print(longest_repaint("RRGRGGGR", 2))

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