给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。
示例 1:
输入:s = “aaabb”, k = 3
输出:3
解释:最长子串为 “aaa” ,其中 ‘a’ 重复了 3 次。
解题思路
枚举滑动窗口内不同字母的个数,限制合法的窗口除了需要满足题目条件外还必须包含特定数目的不同字母
代码
class Solution {
public int longestSubstring(String s, int k) {
int n=s.length(),len=0;
for (int i = 1; i <=26; i++) {
int[] cnt=new int[26];
int l=0,r=0,total=0,less=0,cur=0;
//less记录出现次数小于k的字母个数,cur窗口内不同字母的个数
while (r<n)
{
cnt[s.charAt(r)-'a']++;
int i1 = cnt[s.charAt(r) - 'a'];
if(i1 ==1)//窗口内第一次出现的字母
{
cur++;
less++;
}
if(i1==k) less--;//窗口内已经满足条件的字母
while (cur>i)//不同字母的个数过多,需要移动窗口直到个数符合
{
if(cnt[s.charAt(l)-'a']==1)
{
less--;
cur--;
}
if(cnt[s.charAt(l)-'a']==k){
less++;
}
cnt[s.charAt(l)-'a']--;
l++;
}
if(less==0)
len= Math.max(len,r-l+1);
r++;
}
}
return len;
}
}