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

C++で最長のパリンドロームサブシーケンス


文字列sがあるとすると、パリンドロームサブシーケンスの最長の長さをsで見つける必要があります。 sの最大長は1000であると想定できます。したがって、入力が「bbbab」のような場合、出力は4になります。考えられるパリンドロームのサブシーケンスの1つは「bbbb」です。

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

  • x:=s、次にx、n:=sのサイズを逆にする
  • nが0の場合、0を返します
  • sの前に1つの空白スペースを追加してsを更新し、xの前に1つの空白スペースを追加してxを更新します
  • ret:=0
  • サイズ(n + 1)x(n + 1)の1つの行列dpを作成します
  • 1からnの範囲のiの場合
    • nからnの範囲のjの場合
      • dp [i、j]:=最大dp [i、j – 1]、dp [i – 1、j]
      • x [i] =s [j]の場合、dp [i、j]:=最大のdp [i、j]および1 + dp [i – 1、j – 1]
  • return dp [n、n]

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int longestPalindromeSubseq(string s) {
      string x = s;
      reverse(x.begin(), x.end());
      int n = s.size();
      if(!n) return 0;
      s = " " + s;
      x = " " + x;
      int ret = 0;
      vector < vector <int> > dp(n + 1, vector <int>(n + 1));
      for(int i = 1; i <= n; i++){
         for(int j = 1; j <= n ; j++){
            dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
            if(x[i] == s[j]) {
               dp[i][j] = max(dp[i][j], 1 + dp[i - 1][j - 1]);
            }
         }
      }
      return dp[n][n];
   }
};
main(){
   Solution ob;
   cout << (ob.longestPalindromeSubseq("bbbab"));
}

入力

"bbbab"

出力

4

  1. C++で最も長く増加するサブシーケンスの数

    ソートされていない整数の配列が1つあるとします。最長増加部分列の数を見つける必要があるため、入力が[1、3、5、4、7]の場合、増加部分列は[1,3,5,7]であり、出力は2になります。 [1、3、4、7] これを解決するには、次の手順に従います- n:=num配列のサイズ、サイズnの2つの配列lenとcntを作成し、それらに値1を入力します。 lis:=1 1からnの範囲のiの場合 0からi–1の範囲のjの場合 nums [j]の場合、 len [i]の場合、len [i]:=len [j] + 1、およびcnt [i]:=cnt [j] それ以外の場合、len [j] +

  2. 最長共通部分列のためのC++プログラム

    サブシーケンスは、要素のセットと同じ順序のシーケンスです。シーケンス「stuv」の場合、サブシーケンスは「stu」、「tuv」、「suv」などです。 長さnの文字列の場合、文字列からサブシーケンスを作成する方法は2nあります。 例 文字列「ABCDGH」および「AEDFHR」の最長共通部分列の長さは3です。 #include <iostream> #include <string.h> using namespace std; int max(int a, int b); int lcs(char* X, char* Y, int m, int n){