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

Pythonで3つの文字列の最長共通部分列の長さを見つけるプログラム


3つの文字列s1、s2、およびs3があるとすると、それらの最長共通部分列の長さを見つける必要があります。

したがって、入力がs1 ="ababchemxde" s2 ="pyakcimde" s3 ="oauctime"の場合、最長共通部分列は "acme"であるため、出力は4になります。

これを解決するには、次の手順に従います-

  • m:=s1のサイズ、n:=s2のサイズ、o:=s3のサイズ
  • dp:=サイズ(o + 1)x(n + 1)x(m + 1)の3D行列
  • 1からmの範囲のiについては、
    • 1からnの範囲のjについては、
      • 1からoの範囲のkについては、
        • s1 [i-1]、s2 [j-1]、s3 [k-1]が同じ場合、
          • dp [i、j、k]:=1 + dp [i-1、j-1、k-1]
        • それ以外の場合、
          • dp [i、j、k] =(dp [i-1、j、k]、dp [i、j-1、k]およびdp [i、j、k-1])の最大値
  • return dp [m、n、o]

例(Python)

理解を深めるために、次の実装を見てみましょう-

class Solution:
   def solve(self, s1, s2, s3):
      m = len(s1)
      n = len(s2)
      o = len(s3)
      dp = [[[0 for i in range(o + 1)] for j in range(n + 1)] for k in range(m + 1)]
      for i in range(1, m + 1):
         for j in range(1, n + 1):
            for k in range(1, o + 1):
               if s1[i - 1] == s2[j - 1] == s3[k - 1]:
                  dp[i][j][k] = 1 + dp[i - 1][j - 1][k - 1]
               else:
                  dp[i][j][k] = max(dp[i - 1][j][k], dp[i][j - 1][k], dp[i][j][k - 1])
         return dp[m][n][o]
ob = Solution()
s1 = "ababchemxde"
s2 = "pyakcimde"
s3 = "oauctime"
print(ob.solve(s1, s2, s3))

入力

"ababchemxde", "pyakcimde", "oauctime"

出力

4

  1. Pythonで最も長いバランスの取れたサブシーケンスの長さを見つけるプログラム

    括弧「(」および「)」を含む文字列sがあるとすると、バランスの取れた括弧の最長のサブシーケンスの長さを見つける必要があります。 したがって、入力がs =())(()(の場合、出力は4になります。これは、 ()()のようなサブシーケンスを取ることができるためです。 これを解決するには、次の手順に従います- res:=0 n:=sのサイズ close:=0 n-1から0の範囲のiの場合、1ずつ減らします。 s[i]が)と同じ場合、 close:=close + 1 それ以外の場合 0の場合、 close:=close-1 r

  2. Pythonの文字列のリストから最長の共通プレフィックスを見つけるプログラム

    小文字の文字列のリストがあるとすると、最も長い共通プレフィックスを見つける必要があります。 したがって、入力が[antivirus、 anticlockwise、 antigravity]の場合、出力は antiになります。 これを解決するには、次の手順に従います- リストの単語をアルファベット順に並べ替える プレフィックス:=新しいリスト フラグ:=0 0から単語のサイズ[0]までの範囲のiの場合、実行 単語のjごとに、 j [i]がプレフィックスの最後の要素と同じでない場合、 プレフィックスから最後の要素を削除 フラグ:=1 ループから抜け出す フラグが1と同じ場合