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

C++で別の文字列の部分文字列である1つの文字列の最長部分列の長さを検索します


2つの文字列XとYがあり、文字列Xの最長部分列の長さを見つける必要があるとします。これは、シーケンスYの部分文字列です。したがって、X =“ ABCD”およびY =“ BACDBDCD”の場合、出力は3になります。 。「ACD」はXの最長のサブシーケンスであり、Yのサブストリングです。

ここでは、動的計画法を使用してこの問題を解決します。したがって、Xの長さがnで、Yの長さがmの場合、次数(m + 1)x(n + 1)のDP配列を作成します。 DP [i、j]の値は、X [0…j]のサブシーケンスの最大長であり、Y[0…i]のサブストリングです。これで、DPの各セルについて、次のようになります。

  • 1からmの範囲のiの場合:
    • 1からnの範囲のjの場合
      • X [i –1]がY[j – i]と同じ場合、DP [i、j]:=1 + DP [i – 1、j – 1]
      • それ以外の場合、DP [i、j]:=1 + DP [i、j – 1]

そして最後に、yの部分文字列であるxの最長部分列の長さは、max(DP [i、n])です。ここで、1 <=i<=m。

#include<iostream>
#define MAX 100
using namespace std;
int maxSubLength(string x, string y) {
   int table[MAX][MAX];
   int n = x.length();
   int m = y.length();
   for (int i = 0; i <= m; i++)
      for (int j = 0; j <= n; j++)
   table[i][j] = 0;
   for (int i = 1; i <= m; i++) {
      for (int j = 1; j <= n; j++) {
         if (x[j - 1] == y[i - 1])
            table[i][j] = 1 + table[i - 1][j - 1];
         else
            table[i][j] = table[i][j - 1];
      }
   }
   int ans = 0;
   for (int i = 1; i <= m; i++)
   ans = max(ans, table[i][n]);
   return ans;
}
int main() {
   string x = "ABCD";
   string y = "BACDBDCD";
   cout << "Length of Maximum subsequence substring is: " << maxSubLength(x, y);
}

出力

Length of Maximum subsequence substring is: 3

  1. Pythonの文字列で最も長く繰り返される部分文字列の長さを見つけるプログラム

    小文字の文字列sがあるとすると、sで少なくとも2回出現する最長の部分文字列の長さを見つける必要があります。そのような文字列が見つからない場合は、0を返します。 したがって、入力がs =abdgoalputabdtypeabdの場合、複数回出現する最長のサブストリングは abdであるため、出力は3になります。 これを解決するには、次の手順に従います- 関数lcs()を定義します。これにはs1、s2が必要です n:=s1の最小サイズとs2のサイズ 0からn-1の範囲のiの場合、do s1[i]がs2[i]と同じでない場合、 s1の部分文字列を返す[インデックス0からi-1へ]

  2. Pythonで1回0フリップした後、バイナリ文字列で1が含まれる最長の部分文字列の長さを検索するプログラム

    バイナリ文字列sがあるとします。最大で1つの「0」から「1」に反転できます。連続する最長の1の部分文字列の長さを見つける必要があります。 したがって、入力がs =1010110001の場合、出力は4になります。たとえば、インデックス3にあるゼロを反転すると、文字列 1011110001が得られます。ここで、1の最長の部分文字列の長さは4です。 。 これを解決するには、次の手順に従います- n:=sのサイズ ans:=0、ones:=0、left:=0、right:=0 正しい