C++の個別のサブシーケンスII
文字列Sがあるとすると、Sの個別のサブシーケンスの数をカウントする必要があります。結果は大きくなる可能性があるため、10 ^ 9+7を法とする答えを返します。
したがって、入力が「bab」のような場合、出力は6になります。これは、「a」、「b」、「ba」、「ab」、「bb」、「abb」の6つの異なるシーケンスがあるためです。
これを解決するには、次の手順に従います-
-
関数add()を定義します。これには、a、b、
が必要です。 -
return((a mod MOD)+(b mod MOD))mod MOD
-
関数sub()を定義します。これには、a、b、
が必要です。 -
return(((a mod MOD)-(b mod MOD))+ MOD)mod MOD
-
関数mul()を定義します。これにはa、b、
が必要です。 -
return((a mod MOD)*(b mod MOD))mod MOD
-
メインメソッドから、次のように-
-
n:=sのサイズ
-
サイズ26の配列dpを定義します
-
res:=0
-
s:=sの前にスペースを連結する
-
初期化i:=1の場合、i <=nの場合、更新(iを1増やします)、実行-
-
x:=s [i]
-
追加:=sub(add(res、1)、dp [x-'a'])
-
dp [x-'a'] =add(dp [x-'a']、追加)
-
res:=add(res、added)
-
-
解像度を返す
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; typedef long long int lli; const lli MOD = 1e9 + 7; class Solution { public: lli add(lli a, lli b){ return ( (a % MOD) + (b % MOD) ) % MOD; } lli sub(lli a, lli b){ return ( ( (a % MOD) - (b % MOD) ) + MOD ) % MOD; } lli mul(lli a, lli b){ return ( (a % MOD) * (b % MOD) ) % MOD; } int distinctSubseqII(string s) { int n = s.size(); vector <lli> dp(26); int res = 0; s = " " + s; for(lli i = 1; i <= n; i++){ char x = s[i]; int added = sub(add(res, 1) , dp[x - 'a']); dp[x - 'a'] = add(dp[x - 'a'], added); res = add(res, added); } return res; } }; main(){ Solution ob; cout << (ob.distinctSubseqII("bab")); }
入力
"bab"
出力
6
-
文字列のすべてのサブシーケンスをC++で出力します
この問題では、文字列が与えられ、文字列のすべてのサブシーケンスを出力する必要があります。生成される部分文字列は、文字列の要素を削除することによって作成されますが、順序は同じままです(つまり、順序を変更することはできません)。 トピックをよりよく理解するために例を見てみましょう- Input: xyz Output: x,y,z,xy,yz,xz,xyz 説明 −上記の例では、サブストリングを作成するために文字のみが削除されていることがわかります。いいえ、再配置が行われます。 この問題を解決するには複数の方法があります。ここでは、方法を理解するためにそれらのいくつかについて説明します。
-
C ++のソートされた配列の絶対的な個別のカウント?
配列は、同じデータ型の要素のコレクションです。 ソートされた配列 は、昇順または降順の順序で要素が格納されている配列です。 明確な数は、同じではない要素の数です。 絶対個別カウントは、要素の絶対値、つまり符号のない要素(符号なしの値)の個別カウントです。 このプログラムでは、ソートされた配列で絶対的な個別のカウントを見つけます。つまり、配列の各要素の絶対値を考慮した場合、個別の値の数をカウントします。 たとえば、 Input : [-3 , 0 , 3 , 6 ] Output : 3 配列には3つの異なる絶対値があり、要素は0、3、および6です。 これを解決するために、さまざまな