蠡口115。個別のサブ配列

通常、DP、2つの文字列の食事を動作させるためにあるTまたはFを返します。

図1は、状態変数をDP行列を確立する: DP [I] [J]は、Sの異なるサブシーケンスの数を表す[ 0:i]がTに等しく[0:J] :およびT [0、S [I 0]であります:得られた関数値にj]は、初期値は0に設定されています。

図2に示すように、境界線を決定する:文字が空Tではない場合sはヌル文字である場合、次いで、SがTと同じ文字列を取得する文字列内の文字の削除によるものであり、DP [0] [j]はです0(> 0任意のjに対して)。およびs [0](何も処理ヌル文字はヌル文字ではないので、任意のiについて、0を含む)[i]のようにDP、ヌル文字を取得するために、すべての文字を削除した場合にのみ場合、Tは、ヌル文字である場合。

図3に示すように、伝達方程式の確立:我々はDP [I] [j]を考えるとき、2つの状況が存在してもよい:1)S [I-1 ]≠T [J-1]; 2)S [I-1] == T [J-1]。議論のレッツポイントは、次の図を参照して理解することができます。

  1)S [I-1]≠T [J-1]、S [0:I]のT [0:J]となる、少なくともSに[I-1]の削除、削除されたS [ K:I(K> 0)、次にDP [I] [j]はΣdpに等しくない[K] [j]は、それ?実際には、DP [I-1] [j]は[K] [j]は、すべての先行DPに含まれています。リコールマトリクス定義DP、DPは[I-1] [j]は、Tの最初のj個の文字の全変換を変換することができ、I-1の文字は、それはすべてのkを含む前部を示し、(K > 0)、S [0:K] Tへの[0:j]を、次にS [kは:i]はこのような動作を削除します。従って、DP [I-1] [j]は、すべてのそのような操作の数です。(本当に食事は虎ああとして激しい動作します!)。したがって、[I] [j]はDP [I-1] [j]を= DP。

  2)S [I-1] == T [J-1]、今回は、S [I-1]、DP [I-1] [j]を参照し、削除することができ、S [I-1]、参照を保持することができますDP [I-1]〜[J-1]。T [0:(J-1)]に、この時間は、同様のDP [I-1] [j]は、DP [I-1] [J-1]は、すべてのS [K 0]を含むことに留意すべきですその後、S [K:(I-1)は、このような操作を削除します。したがって、[I] [j]はDP [I-1]〜[J] + DP [I] [J-1] = DP。

 

 図4に示すように、戻り値は: [貸与] DP [レンズ]を返すべきである S [0:レンズ] [0:貸し] Tを変換する番号変換を。

 

クラスのソリューション(オブジェクト):
     デフnumDistinct(自己
        、S、T):""」
        :タイプS:STR
        :型t:STR
        :RTYPE:int型
        ""」
        もし LEN(S)<LEN(T):リターン(0)
        貸与レンズ、 = LEN(S)、LEN(T)
        Sの異なるサブシーケンスの番号[0:::I] Tに等しい[J 0] DP [I] [J] 
        DP = [0のための J 範囲(貸与+ 1)] のための I における範囲(レンズ+ 1 )]
         のための I における範囲(レンズ+ 1):DP [I] [0] = 1
         のための I における範囲(1、レンズ+ 1 のために J (1、+ 1を貸し範囲):
                DP [I] [J] = DP [I-1 ] [j]の
                 場合、S [I-1] == T [J-1]:DP [I] [J] + = DP [I-1] [J -1 ]
         リターン(DP [レンズ] [貸与])

 

おすすめ

転載: www.cnblogs.com/Leisgo/p/11703574.html