トピックリンク:
https://leetcode-cn.com/problems/distinct-subsequences/submissions/
アイデア:
タイトルDP
状態遷移方程式は次のとおりです。
もし(S [J] == T [i])とDP [I] [J] = DP [I-1]〜[J-1] = DP [I] [J-1] //意味:文字列の場合ストリングに登場し、この前に対応する文字、転送ステータス、文字列の部分集合の数と同じで、私は理解して、(知っていることを明確にしていないしていない文字列の出現回数の前にプラスに表示されるサブ回数です/思考)
他DP [I] [J] = DP [I]、[J-1]、等しくない場合は、このセルにためない(すなわち、セルの値に、セットで発生する電流ストリングの数でなければなりません新しい同じ文字列)
次のようにフォームを示します:
(空の文字列は確かに、すべての部分文字列に一度表示され、元の文字列が空であるため、最初の列は、該当する外観はありません - 大きな音は明らかではないかもしれない、悪い言語、しかしためのプラグイン理解/彼の背後にあります。 )
トン\ sの | 「」 | B | A | B | グラム | B | A | グラム |
「」 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
B | 0 | 1 | 1 | 2 | 2 | 3 | 3 | 3 |
A | 0 | 0 | 1 | 1 | 1 | 1 | 4 | 4 |
グラム | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 5 |
ここではソースコードは次のとおりです。
パッケージleetcode。 パブリック クラスNumDistinct { / ** *動的プログラミング * @param S * @param T *ステータス転送式である: *もしS == T DP [I] [J] = DP [I-1] [J-1] + DP [I] [J-1]:既に手段の組み合わせの合計とが存在する !* sの場合= T DP [I] [J] = DP [I] [J-1] * @return * / 公共 int型numDistinct(文字列s、文字列T){ 場合(s.length()== 0 && t.length()== 0)戻り 0 ; INT [] [] DP = 新しい int型[t.length()+ 1] [s.length()+ 1]。// ビルドステータス転送アレイ のための(INT ; I <dp.length ++ iが0 = {I) DP [I] [ 0] = 0 ; } のための(int型 J = 0; J <dp.length; ++ J){ DP [ 0] [J] = 1 。 } // 初期化 チャー [] s_temp = s.toCharArray()。 CHAR [] t_temp = t.toCharArray()。 以下のために(INT I 1 =; I <dp.length; ++ I){ ため(INT J = 1; J <DP [0] .LENGTH; ++J){ 場合(t_temp [I-1] == s_temp [J-1 ]) DP [I] [J] = DP [I-1] [J-1] + DP [I]、[J-1 ]。 他 DP [I] [J] = DP [I]、[J-1 ]。 } } 戻りDP [s.length()] [t.length()]。 } }
コードはACとなっています
私は助けたいです
上記