至少有 K 个重复字符的最长子串
递归的方式
对于这个字符串来说,如果某个字符(比如t)的数量小于k的话,那么满足要求的一定在用t分割的字符串的所有字串中。运用这种思想,可以使用递归的方法来求解。代码如下
class Solution {
/**
* @param String $s
* @param Integer $k
* @return Integer
*/
function longestSubstring($s, $k) {
$length = strlen($s);
// 如果字符串的长度小于$k,则必然没有
if($length < $k) return 0;
// 统计所有字符出现的数量
$cnts = [];
for($i = 0; $i < $length; $i++){
$cnts[$s[$i]] = isset($cnts[$s[$i]]) ? $cnts[$s[$i]] + 1 : 1;
}
// 循环字符,如果有字符的数量小于$k,则分割字符串,求所有字串中的最大的数量
foreach($cnts as $key => $cnt){
if($cnt < $k){
$max = 0;
$splits = explode($key, $s);
foreach($splits as $split){
$max = max($max, $this->longestSubstring($split, $k));
}
return $max;
}
}
return $length;
}
}