封面

1297. 子串的最大出现次数

写作时间:2026-05-02 14:44
# 力扣算法专题
# 滑动窗口

1297. 子串的最大出现次数 - 力扣(LeetCode)

条件约束为:

  • 不同字母数目小于等于 maxLetters
  • 子串长度大于等于 minSize 且小于等于 maxSize

思路:

  • 子串越短,越容易满足条件一,并且次数出现最大。
  • 转化为定长滑动窗口,定长为 minSize。
  • 遵循滑动窗口模板:右边进入 -> 判断长度 -> 判断结果 -> 左边出去
class Solution {
    public int maxFreq(String S, int maxLetters, int minSize, int maxSize) {
        int[] num = new int[26];
        Set<Character> letter = new HashSet<>();
        char[] s = S.toCharArray();
        Map<String,Integer> res = new HashMap<>();
        StringBuilder sb=new StringBuilder();
        int l=0,cur;
        for(int i=0;i<s.length;i++){
            cur=s[i]-'a';
            letter.add(s[i]);
            num[cur]++;
            sb.append(s[i]);
            if(i<minSize-1){
                continue;
            }
            if(letter.size()<=maxLetters){
                res.merge(sb.toString(),1,Integer::sum);
            }
            sb.deleteCharAt(0);

            if(--num[s[l]-'a']==0){
                letter.remove(s[l]);
            }
            l++;
        }
        int r=0;
        for(int v:res.values()){
            r=Math.max(r,v);
        }
        return r;
    }
}