少なくともK文字の繰り返しとlc395最長サブストリング
アイデアは、1から26まで、計算する文字のサブストリングの数に応じて異なります
各計算のためのN個の異なる文字は、最長のストリングで構成することができます
最長の部分文字列を記録します
単一サイクルは、両手後端トラバーサルSと、ストリングの長さを計算し始めます
見て文字と文字の== N数がkに等しい発生数よりも大きいです
DESCRIPTION開始〜このストリングの末尾には、MAXLENを更新し、一致しました
その後、>場合は、それが==なるように、後方に移動することを開始します
<演算子を必要としない場合
1 クラスソリューション{ 2 公共 のint longestSubstring(文字列s、int型K){ 3 であれば(s.length()== 0 || s.length()< K) 4 戻り 0 ; 5 int型の最大値= 0 ; 図6は、 のために(int型 i = 1; iは<= 26; I ++ ){ 7 マックス= Math.max(MAX、ヘルパー(S、K、I))。 8 } 9 10 戻りマックス。 11 } 12 13 プライベート int型ヘルパー(文字列S、INTK、INT abcNum){ 14 のint []カウント= 新しい INT [128 ]。 15 INT始める= 0、終了= 0 。 16 INT seenChar = 0、noLessThanK = 0 。 17の INTは RES = 0 。 18 19 一方(端< s.length()){ 20 であれば(カウント[s.charAt(終了)] ++ == 0 ) 21 seenChar ++ 。 22 場合([s.charAt(端++)] ==カウントK) 23 noLessThanKを++ 。 24 25 / * {(seenChar> abcNum)一方、 26 ([s.charAt(開始)]カウント- == k)の場合は 27 noLessThanK--。 28 ([s.charAt(++開始)] == 0をカウント)であれば 29 seenChar--。 30 } * / 31 ながら(seenChar> abcNum){ 32 場合(カウント[s.charAtが(開始)] - == 1 ) 33 seenChar-- 。 34 であれば(カウント[s.charAtは(開始++)] == K-1 ) 35 noLessThanK-- 。 36 } 37 38 であれば(seenChar == noLessThanK && seenChar == abcNum) 39の RES = Math.max(RES、エンド始めます)。 40 } 41の 42 戻りRES。 43 } 44 }