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

ボトムアップアプローチによる動的計画法を使用して最長の共通部分文字列を見つけるPythonプログラム


ボトムアップアプローチによる動的計画法を使用して最長の共通部分文字列を見つける必要がある場合は、より小さな問題の解を計算するメソッドを定義できます。これらの小さな問題の結果は、何度も計算する必要はありません。代わりに、必要なときにアクセスできます。これは、手元にあるより大きな問題の解決策を開発することにつながります。

以下は同じのデモンストレーションです-

def compute_lcw(string_1, string_2):
   val = [[-1]*(len(string_2) + 1) for _ in range(len(string_1) + 1)]
   for i in range(len(string_1) + 1):
      val[i][len(string_2)] = 0
   for j in range(len(string_2)):
      val[len(string_1)][j] = 0
   lcw_i = lcw_j = -1
   lcw_len = 0
   for i in range(len(string_1) - 1, -1, -1):
      for j in range(len(string_2)):
         if string_1[i] != string_2[j]:
            val[i][j] = 0
         else:
            val[i][j] = 1 + val[i + 1][j + 1]
            if lcw_len < val[i][j]:
               lcw_len = val[i][j]
               lcw_i = i
               lcw_j = j
   return lcw_len, lcw_i, lcw_j
string_1 = 'bull'
string_2 = 'bullied'
lcw_len, lcw_i, lcw_j = compute_lcw(string_1, string_2)
print("The longest common substring is : ")
if lcw_len > 0:
   print(string_1[lcw_i:lcw_i + lcw_len])

出力

The longest common substring is :
bull

説明

  • 「compute_lcw」という名前のメソッドが定義されています。このメソッドは、パラメーターとして2つの文字列を取ります。
  • 2つの文字列が繰り返され、両方に一致する文字列が見つかったかどうかが確認されます。
  • 1つの文字が見つかった場合でも、それは別の変数に格納されます。
  • これが文字列の最後まで続くと、これらの文字列の両方に別の文字列が共通になります。
  • 2つの文字列が定義されており、これら2つの文字列を渡すことでメソッドが呼び出されます。
  • この操作のデータは変数に割り当てられます。
  • コンソールに出力として表示されます。

  1. Pythonを使用して最大の確率でパスを見つけるプログラム

    n個のノード(ノードには0から番号が付けられます)を持つ無向加重グラフがあるとします。このグラフは、エッジリストを使用して入力として与えられ、各エッジeについて、そのエッジ確率[e]を通過する成功の確率があります。開始ノードと終了ノードもあります。最初から最後まで成功の確率が最大のパスを見つけて、成功の確率を返す必要があります。パスが見つからない場合は、0を返します。 したがって、入力が次のような場合 ノード0から2へのパスが2つあるため、出力は0.24になります。1つは確率0.2、もう1つはノード1を経由するパスの確率は0.4 * 0.6 =0.24で、これが最大です。 これを解

  2. Pythonで文字数がk以上の最長の部分文字列の長さを見つけるプログラム

    各文字がソートされた文字列sがあり、数値kもあるとすると、すべての文字が少なくともk回出現するように、最長の部分文字列の長さを見つける必要があります。 したがって、入力がs =aabccddeeffghij k =2の場合、出力は8になります。これは、ここでの最長の部分文字列が ccddeeffであり、すべての文字が少なくとも2回出現するためです。 これを解決するには、次の手順に従います- 関数rc()を定義します。これには時間がかかります c:=すべての文字とその出現を含むマップ acc:=新しいリスト ans:=0 有効:=真 lstのxごとに、 c [x]