Given a string S, return the number of substrings of length K with no repeated characters.
Example 1:
Input:
S = "havefunonleetcode", K = 5
Output:
6
Explanation:
There are 6 substrings they are : 'havef','avefu','vefun','efuno','etcod','tcode'.
Example 2:
Input:
S = "home", K = 5
Output:
0
Explanation:
Notice K can be larger than the length of S. In this case is not possible to find any substring.
Note:
1 <= S.length <= 10^4- All characters of S are lowercase English letters.
1 <= K <= 10^4
Quite straight forward solution.
the brute force way is foreach K chars, check dupes.
to optimize that, push next char and remove last instead, so same work won’t be done multiple times
<?php
class Solution {
/**
* @param String $S
* @param Integer $K
* @return Integer
*/
function numKLenSubstrNoRepeats($S, $K) {
if($K > strlen($S)){
return 0;
}
// This is not necessary in PHP
$arr = str_split($S);
$dic = [];
$result = 0;
// Helper, any repeated chars so far?
$unique = static function() use (&$dic) {
foreach($dic as $v){
if ($v > 1){
return false;
}
}
return true;
};
// Load first K chars
for($i = 0; $i < $K; $i ++){
if(isset($dic[$arr[$i]])){
$dic[$arr[$i]]++;
} else {
$dic[$arr[$i]] = 1;
}
}
// First K has repeat? update counter
if($unique()){
$result++;
}
// Starting from K, take next char and remove the last one, update dictionary, and check after each round
for($in = $K; $in < strlen($S); $in ++){
if(isset($dic[$arr[$in]])){
$dic[$arr[$in]]++;
} else {
$dic[$arr[$in]] = 1;
}
$out = $in-$K;
$dic[$arr[$out]]--;
if($unique()){
$result++;
}
}
return $result;
}
}
?>