あなたは、文字からなる文字列で与えられている x
と y
、などを xyxxxyxyy
。また、あなたはと呼ばれる操作持っている flip
単一変化し、 x
へ y
、またはその逆を。
あなたはすべてのことを確実にするために、この操作を適用する必要がありますどのように多くの時間を決定 x
の前に、すべての来る y
s 'を。あなたが返さなければならないので、上記の例では、それは、第二及び第六の文字を反転すればよいです 2
。
溶液1 O(N)動的プログラミング
DP [I] [J]:適切にインデックスまで私をサブストリングを注文するために必要な最小フリップ、最後の要素は、値jをとってしまいます。
パブリック クラスMinimumFlipToMakeXYString { パブリック 静的 INT minFlips(文字列S){ int型 N = s.length()。 INT [] [] DP = 新しい INT [N] [2 ]。 DP [ 0] [0] =(s.charAt(0)== 'x'は0:1 )。 DP [ 0] [1] =(s.charAt(0)== 'Y' 0:1 )。 以下のために(int型 I 1 =、iがN <; Iは++ ){ DP [I] [ 0] = DP [I - 1] [0] +(s.charAt(I)== 'x'は0:1 )。 DP [I] [ 1] = Math.min(DP [I - 1] [0]、DP [I - 1] [1])+(s.charAt(I)== 'X' 1:0 ) ; } 戻り Math.min( - [0]、DP [N - 1] DP [1、N] [1 ])。 } パブリック 静的 ボイドメイン(文字列[]引数){ ストリングS1 = "YYX" 。 文字列s2を = "xyxxxyxyyy" 。 文字列S3 = "xyxxxyxyyx" 。 文字列S4 = "xyxxxyxyyxxx" 。 文字列S5 = "yyxxx" 。 System.out.println(minFlips(S5))。 } }
ソリューション2 O(N)プレフィックス合計
次のように代替ソリューションです。まず、我々は数を決定するために私たちの入力オーバーパスを作り y
、各要素の左にあるのを。私たちは、その後の数を見つけるために、第2のパスを行い x
、各要素の右にあるのを。
すべてのソリューションのために、私たちの文字列内のいくつかの要素が、その左にいるすべてのために設定されますが存在する必要があり x
、その右側にすべてがに設定されます y
。その結果、我々は、単にこれらのリストの対の和を見つけ、フリップの最小の合計数を必要とする要素を使用することができます。
パブリック クラスMinimumFlipToMakeXYString { パブリック 静的 INT minFlips(文字列S){ int型 N = s.length()。 INT []左利き= 新しい INT [n]は、rightX = 新しい INT [N]。 左利き[ 0] = 0 。 rightX [N - 1] = 0 。 以下のために(int型 i = 1; iがn <; iは++ ){ レフティ[I] =レフティ[I - 1] +(s.charAt(I - 1)== 'Y' 1:0 )。 } のために(int型 I = N - 2; I> = 0; i-- ){ rightX [I] = rightX [I + 1] +(s.charAt(I + 1)== 'X' 1:0 )。 } INT RES = N。 以下のために(int型、iがn <; I = 0 iは++ ){ RES = Math.min(RESを、左利き[I] + rightX [I])。 } 戻りRESと、 } }