ここでのオリジナルタイトルリンク:https://leetcode.com/problems/find-k-length-substrings-with-no-repeated-characters/
トピック:
文字列を考えると S
、長さのサブストリングの数を返す K
なし繰り返し文字をを。
例1:
入力:S = "havefunonleetcode"、Kは= 5
出力:6
説明:
'havef'、 'avefu'、 'vefun'、 'efuno'、 'etcod'、 'TCODE':彼らは6つのストリングがあります。
例2:
入力:S = 「ホーム」、K = 5の
出力:0
説明:
注意事項Kはこの場合、Sの長さよりも大きくすることができる任意の部分文字列を発見することはできません。
注意:
1 <= S.length <= 10^4
- Sのすべての文字は、英語の文字を小文字されています。
1 <= K <= 10^4
ソリューション:
ノー繰り返し文字を持つサイズKウィンドウの数を確認して下さい。
この文字の頻度がすでにある場合は、それが前に表示される手段、0> Sに文字を指すようにランナーを持って、その後、繰り返し文字プラス1の数を持っています。
ランナー> = K場合、S.charAt(ランナー-K)周波数をデクリメント。その頻度は減少する前に> 1であれば、繰り返し文字のカウントマイナス1。
もしランナー> = K-1となしが繰り返されている文字、その後、RES ++。
時間計算:O(n)を。N = S.length。
スペース:O(1)。
ACのJava:
1 クラスソリューション{ 2 公共 のint numKLenSubstrNoRepeats(文字列s、INT K){ 3 であれば(S == NULL || S.length()< K){ 4 戻り 0 ; 5 } 6 7 INT []地図= 新しい INT [26 ]。 8 int型のランナー= 0 ; 9 int型のカウント= 0 ; 10の int型 RES = 0 。 11 一方(ランナー< S.length()){ 12 もし(マップ[S.charAt(ランナー) - ''] ++> 0 ){ 13 カウント++ 。 14 } 15 16 であれば(ランナー> = K){ 17 であれば(マップ[S.charAt(ランナー-K) - ''] - > 1 ){ 18 count-- 。 19 } 20 } 21 22 であれば(ランナー> = K-1 &&カウント== 0 ){ 23の RES ++ 。 24 } 25 26 ランナー++ 。 27 } 28 29 リターンのres; 30 } 31 }