1.特定のトピック
文字列s、非ヌルサブストリングの数の(連続)0の同じ数を用いて計算し、これらのサブ文字列が全て1と組み合わせ全て0で与えられます。彼らが表示される繰り返しの数を計算するサブストリング。
実施例1:入力: "00110011" 出力:6説明:6サブストリングが連続1,0の同じ数を有する: "0011"、 "01"、 "1100"、 "10"、 "0011" と "01"
いくつかの部分文字列は、彼らが表示された回数を計算するために繰り返していることに注意してください。すべての0(1)が組み合わされていないため、また、「00110011」は、有効なストリングではありません。
実施例2: 入力: "10101" 出力:4 説明:4つのサブストリング"10"、 "01"、 "10"、 "01"、彼らは連続1と0の数が同じ。
アイデアの2.分析
タイトル、最初の思考leetcode20を参照。ブラケット有効、「0」及び1「はブラケットに相当し、カウンタが設けられています。第二の出会い '1' カウンタ+ 1、出会い '0' カウンタ - 1; 1 - ただし、文字列を2回、最初の出会い '0' をカウンタ+ 1、出会い '1' カウンタを横断します。
3.コード
1 公共 int型countBinarySubstrings(文字列S){ 2 int型のカウント= 0 ; 3 INT RES = 0 。 4 のための(INT I 0 =; I <s.length(); I ++ ){ 5が あれば(s.charAt(I)== '0')カウント++ 。 6 場合(s.charAt(I)== '1' ){ 7 場合(カウント> 0 ){//若有可配对的"0"、结果+ 1つの 8 RES ++ 。 9 count-- 。 10 } 11 もし(I + 1 <s.length()&& s.charAt(I + 1)== '0' ){//若无可配对的"1"、计数器置0 12 カウント= 0 ; 13 } 14 } 15 } 16 カウント= 0 ; 17 のために(INT iは= 0; I <s.length(); iは++ ){ 18 であれば(s.charAt(I)== '1')カウント++ 。 19 であれば(s.charAt(I)== '0' ){ 20 であれば(カウント> 0 ){ 21の RES ++ 。 22 count-- ; 23 } 24 もし(I + 1 <s.length()&& s.charAt(I + 1)== '1' ){ 25 カウント= 0 ; 26 } 27 } 28 } 29の リターンRES。 30 }
4.最適化のアイデア
実際に、もしnは「0」と、(N + M)番目の「1」に隣接し、文字列を繰り返し、nが生成されることができるので、長い連続した配列要素のカウント数、のように、すなわち、サブストリングのストリング例えばすることができるs=“11000111000000”
、統計的アレイグループを得ることができます= [2,3,4,6],对该数组做遍历,每次得到 min(groups[i], groups[i+1])的值,将其全部相加可得最后结果。
コードの最適化
1 公共 int型countBinarySubstrings(文字列S){ 2 INT []基= 新しい INT [s.length()]。 3 INT T = 0 。 4 グループ[0] = 1 ; 5 のための(INT I 1 =; I <s.lengthを(); I ++ ){ 6は、 もし(s.charAt(I-1)=!s.charAt(I)){ 7 基[++ T] = 1 。 8 } 他{ 9 基[T] ++ ; 10 } 11 } 12 13 INT ANS = 0 。 14 のために(INT I 1 =、iが<= T; I ++ ){ 15の + = Math.min ANS(群[I-1 ]、グループ[I])。 16 } 17 リターンANS。 18 }