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

C++の個別のサブシーケンス


文字列SとTがあるとします。Tに等しいSの異なるシーケンスの数を数える必要があります。

文字列のサブシーケンスは、残りの文字の相対位置を乱すことなく、文字の一部(なしでもかまいません)を削除することによって元の文字列から形成される新しい文字列であることがわかっています。 (同様に、「ACE」は「ABCDE」のサブシーケンスですが、「AEC」はサブシーケンスではありません)。

入力文字列が「baalllloonnn」と「balloon」の場合、36通りの選択方法があります。

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

  • n:=sのサイズ、m:=tのサイズ。 sとtの前に空白を連結して、sとtを更新します

  • サイズ(n + 1)x(m + 1)の行列を1つ作成します

  • dp [0、0]:=1を設定し、次にすべての行の0番目の列に1を設定し、1を入力します

  • 1からnの範囲のiの場合

    • 1からmの範囲のjの場合

      • s [i] =t [j]の場合、

        • dp [i、j]:=dp [i – 1、j – 1]

      • dp [i、j]:=dp [i、j] + dp [i – 1、j]

  • dp [n、m]

    を返します

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

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
   public:
   int numDistinct(string s, string t) {
      int n = s.size();
      int m = t.size();
      s = " " + s;
      t = " " + t;
      vector < vector <lli>> dp(n + 1, vector <lli> (m + 1));
      dp[0][0] = 1;
      for(int i = 1; i<= n; i++)dp[i][0] = 1;
      for(int i = 1; i <= n; i++){
         for(int j = 1; j <= m; j++){
            if(s[i] == t[j]) dp[i][j] = dp[i - 1][j - 1];
            dp[i][j]+= dp[i - 1][j];
         }
      }
      return dp[n][m];
   }
};
main(){
   Solution ob;
   cout << (ob.numDistinct("baalllloonnn", "balloon"));
}

入力

"baalllloonnn"
"balloon"

出力

36

  1. 文字列のすべてのサブシーケンスをC++で出力します

    この問題では、文字列が与えられ、文字列のすべてのサブシーケンスを出力する必要があります。生成される部分文字列は、文字列の要素を削除することによって作成されますが、順序は同じままです(つまり、順序を変更することはできません)。 トピックをよりよく理解するために例を見てみましょう- Input: xyz Output: x,y,z,xy,yz,xz,xyz 説明 −上記の例では、サブストリングを作成するために文字のみが削除されていることがわかります。いいえ、再配置が行われます。 この問題を解決するには複数の方法があります。ここでは、方法を理解するためにそれらのいくつかについて説明します。

  2. C ++のソートされた配列の絶対的な個別のカウント?

    配列は、同じデータ型の要素のコレクションです。 ソートされた配列 は、昇順または降順の順序で要素が格納されている配列です。 明確な数は、同じではない要素の数です。 絶対個別カウントは、要素の絶対値、つまり符号のない要素(符号なしの値)の個別カウントです。 このプログラムでは、ソートされた配列で絶対的な個別のカウントを見つけます。つまり、配列の各要素の絶対値を考慮した場合、個別の値の数をカウントします。 たとえば、 Input : [-3 , 0 , 3 , 6 ] Output : 3 配列には3つの異なる絶対値があり、要素は0、3、および6です。 これを解決するために、さまざまな