Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで先頭・末尾の文字を削除して再挿入し、目標の文字列を作る最小操作回数を求める

問題概要

互いにアナグラム(同じ文字で構成される順列)の関係にある2つの文字列 S と T が与えられます。
S に対して許されている操作は、「先頭または末尾の1文字を取り除き、文字列中の任意の位置に挿入する」というものです。
この操作を繰り返して S を T に一致させるとき、必要となる最小の操作回数を求めます。

入出力の例

たとえば、入力が s = "zyvxw"、t = "vwxyz" の場合、出力は 3 になります。
実際の操作手順は次のとおりです。

  • 末尾の "w" を取り除き、"v" の直後に挿入 → "zyvwx"
  • 先頭の "z" を取り除き、"x" の直後に挿入 → "yvwxz"
  • 先頭の "y" を取り除き、"x" の直後に挿入 → "vwxyz"

わずか3回の操作で S を T へ変換できました。

解法のアプローチ

この問題を解く鍵は、「移動しなくて済む文字をできるだけ多く残す」ことです。
S の連続した区間のうち、T の部分列としても一致する最長の区間を見つけられれば、その区間の文字はそのまま残せます。したがって、答えは「文字列の長さ n − 残せる最大区間の長さ」となります。

具体的には、次の手順で求めます。

  • ans := s の長さ、n := s の長さ として初期化する
  • i を 0 から n−1 まで動かし、残す区間の開始位置とする
  • k := 0 とし、j を i から n−1 まで動かして区間の終端を伸ばしていく
  • t を k 番目以降から走査し、s[j] と一致する文字が見つかれば、区間 [i, j] は T の部分列として成立しているため、ans を min(ans, n − (j − i + 1)) で更新する
  • すべての開始位置について確認が終わったら、ans を返す

実装例(Python)

以下のコードで、より理解が深まります。

class Solution:
   def solve(self, s, t):
      ans = n = len(s)

      for i in range(n):
         k = 0
         for j in range(i, n):
            for k in range(k, len(t)):
               if s[j] == t[k]:
                  ans = min(ans, n - (j - i + 1))
                  break
            k += 1

      return ans

ob = Solution()
s = "zyvxw"
t = "vwxyz"
print(ob.solve(s, t))

入力

"zyvxw", "vwxyz"

出力

3

計算量の目安

時間計算量:O(n² × m)(n は s の長さ、m は t の長さ)
空間計算量:O(1)


  1. Pythonで文字列からn番目の文字を削除するプログラムの書き方

    はじめにこの記事では、以下の問題に対する解決方法を解説します。問題文 − 与えられた文字列から、指定したインデックス(i番目)の文字を削除し、その結果を表示します。Pythonの文字列では、インデックスは必ず0から始まるという点に注意してください。例えば、「Tutorialspoint」という文字列の場合、各文字のインデックスは以下のように対応しています。T u t o r i a l s p o i n t 0 1 2 3 4 5 6 7 8 9 10 11 12 13それでは、この問題を解決するためのPythonスクリプトを見ていきましょう。実装例def remove(string

  2. Pythonで文字列からn番目の文字を削除する方法【サンプルコード付き】

    Pythonにおいて、文字列は文字の配列として扱われます。そのため、先頭の文字のインデックスは「0」から始まり、各文字の位置(インデックス)を簡単に取得できます。この性質を利用すると、指定したn番目の文字だけを削除することが可能です。 基本的な考え方はシンプルです。削除したい文字のインデックス番号を受け取り、元の文字列を次の2つの部分文字列に分割します。 n番目のインデックスの文字より前の部分 n番目のインデックスの文字より後の部分 その後、この2つの部分文字列を連結すれば、n番目の文字が取り除かれた新しい文字列が完成します。 実行例 入力: python 削除するインデックス: 3 出