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

C++で最長の一般的な部分文字列の長さを見つけるプログラム


2つの小文字の文字列XとYがあるとすると、それらの最長の共通部分文字列の長さを見つける必要があります。

したがって、入力がX ="helloworld"、Y ="worldbook"の場合、 "world"は最長の共通部分文字列であり、その長さは5であるため、出力は5になります。

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

  • サイズが最も長い配列を定義します:m + 1 x n+1。

  • len:=0

  • 初期化i:=0の場合、i <=mの場合、更新(iを1増やします)、実行-

    • 初期化j:=0の場合、j <=nの場合、更新(jを1増やします)、実行-

      • iが0と同じか、jが0と同じ場合、-

        • longest [i、j]:=0

      • それ以外の場合、X[i-1]がY[j-1]と同じである場合、-

        • longest [i、j]:=longest [i-1、j-1] + 1

        • len

          • len:=longest [i、j]

          • 行:=i

          • col:=j

      • それ以外の場合

        • longest [i、j]:=0

    • lenを返す

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

#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
int solve(char* X, char* Y, int m, int n){
   int longest[m + 1][n + 1];
   int len = 0;
   int row, col;
   for (int i = 0; i <= m; i++) {
      for (int j = 0; j <= n; j++) {
         if (i == 0 || j == 0)
            longest[i][j] = 0;
         else if (X[i - 1] == Y[j - 1]) {
            longest[i][j] = longest[i - 1][j - 1] + 1;
            if (len < longest[i][j]) {
               len = longest[i][j];
               row = i;
               col = j;
            }
         }
         else
            longest[i][j] = 0;
      }
   }
   return len;
}
int main(){
   char X[] = "helloworld";
   char Y[] = "worldbook";
   int m = strlen(X);
   int n = strlen(Y);
   cout << solve(X, Y, m, n);
   return 0;
}

入力

"helloworld", "worldbook"

出力

5

  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で最長のパリンドローム部分文字列の長さを見つけるプログラム

    文字列Sがあるとします。Sで最長の回文部分文字列の長さを見つける必要があります。文字列Sの長さは1000であると想定しています。したがって、文字列が「BABAC」の場合、最長の回文部分文字列は「BAB」です。長さは3です。 これを解決するには、次の手順に従います- 文字列の長さと同じ次数の正方行列を1つ定義し、Falseで埋めます 主対角要素をtrueに設定し、DP [i、i] =0からorder–1までのすべてのiに対してTrue start:=0 範囲2からS+1の長さのlの場合 0からSの長さまでの範囲のiの場合– l + 1 終了:=i + l