https://leetcode-cn.com/problems/is-subsequence/solution/java-dp-by-zxy0917-5/
説明
文字列sとtを考えると、SはTのシーケンスかどうかが決定されます。
あなたはSと考えることができ、tは小文字のみが含まれています。Tは非常に長い文字列(長さ=〜50万)することができ、そしてsは短い文字列(長さ<= 100)。
文字列は元の文字列のシーケンス番号が形成されている新たな相対位置の残りの文字の文字列を変更することなく削除する(または削除されなくてもよい)です。(例えば、 "ACE" は、配列の "ABCDE" であり、 "AEC" の代わりに)。
示例1:
S = "ABC"、T = "ahbgdc"
trueを返します。
示例2:
S = "AXC"、T = "ahbgdc"
falseを返します。
フォローアップの挑戦:
入力Sの大多数は、S1、S2、...、Skとのk> = 100億あなたはT.の配列とそれらを必要とするかどうかを確認するために、と呼ばれる場合 このケースでは、コードを変更する何でしょうか?
解決
直接のアイデア
直接トラバーストン、ポインタ。比較ができます。
ダイナミックプログラミング
ソリューション・シーケンスは、動的プログラミングを使用することができます。
二次元アレイブール[] [] DP =新しいブール[SLEN + 1] [TLEN + 1]を生成するステップと、サブストリングの先頭からサブストリングの先頭からiはT jのかどうかについての配列
長さsが0である場合には、tは確かにサブシーケンスです。即ちDP [0] [j]が真=。
状態遷移式:
ときのchar [i]を==のchar [j]を、私はJの文字列でなければなりません。このとき0に〜I-1配列のサブストリングは、0〜J-1サブストリング(すなわち、DP [I-1] [J-1] =真)である場合、DP [i] [j]は真= 。従ってDP [I] [j]はDPを= [I-1] [J-1]。
CHAR [I]!= CHAR [i]は、即ち、サブストリングに電流I 0を決定すると、すなわち、DP J-1配列のサブストリング、0である場合[i] [j]はDPを= [I] [J - 1]。
AB、EABC、などのT Sの最後の文字と最後の文字は等しくないが、しかし配列はEAB ABので、シーケンスABがEABCあるので
コード
直接のアイデア
パブリック ブールisSubsequence(文字列の文字列T){ int型 SLEN = s.length()。 INT TLEN = t.length()。 場合(SLEN <= 0 ){ 戻り 真。 } 他の 場合(SLEN> TLEN){ 戻り 偽。 } int型の SS = 0 。 以下のために(int型 i = 0; iはTLENを<; iは++ ){ 場合(s.charAt(SS)== t.charAt(I)){ SS ++ 。 場合(==など重症筋無力症){ 戻り 真。 } } } 戻りよう==眠気を、
ダイナミックプログラミング
パブリック ブールisSubsequence(文字列の文字列T){ int型 SLEN = s.length()。 INT TLEN = t.length()。 場合(SLEN <= 0 ){ 戻り 真。 } 他の 場合(SLEN> TLEN){ 戻り 偽。 } ブール [] [] DP = 新しい ブール [SLEN + 1] [TLEN + 1 ]。 以下のために(int型 i = 0; iはTLENを<; iは++ ){ DP [ 0] [I] = 真。 } のための(int型 i = 1; iがSLEN + 1 <; Iは++ ){ ため(INT J = 1; J <TLEN + 1、J ++ ){ 場合(s.charAt(I - 1)== t.charAt(J - 1 )){ DP [I] [J] = DP [I - 1] [J - 1 ]。 } 他{ DP [I] [J] = DP [I]、[J - 1 ]。 } } } 戻りDP [SLEN] [TLEN]。 }