zoukankan      html  css  js  c++  java
  • [LeetCode]子串的最大出现次数(字符串)

    题目

    给你一个字符串 s ,请你返回满足以下条件且出现次数最大的 任意 子串的出现次数:

    子串中不同字母的数目必须小于等于 maxLetters 。
    子串的长度必须大于等于 minSize 且小于等于 maxSize 。

    示例 1:

    输入:s = "aababcaab", maxLetters = 2, minSize = 3, maxSize = 4
    输出:2
    解释:子串 "aab" 在原字符串中出现了 2 次。
    它满足所有的要求:2 个不同的字母,长度为 3 (在 minSize 和 maxSize 范围内)。

    题解

    • 如果subStr是满足包含字母种类<=maxLetters的子串,则subStr的子串也一定是,所以maxSize是没用的。
    • 故题意:找到len=minSize的,且包含字母种类<=maxLetters的子串,出现次数最多的即可。
    • 故思路:1 遍历原串的所有长度为minSize的字串;2 判断是否满足字母种类<=maxLetters;3 并维护一个HashMap表示满足的子串的出现次数,最终找出现次数最多的即可。
      其中,字母种类放入set中看set.size()即可得到。

    代码

    class Solution {
        public int maxFreq(String s, int maxLetters, int minSize, int maxSize) {
            Map<String,Integer> map = new HashMap<>();
            for(int i=0;i+minSize<=s.length();++i){
                String subStr= s.substring(i,i+minSize);
                if(isVaild(subStr,maxLetters)){
                    map.put(subStr,map.getOrDefault(subStr,0)+1);
                }
            }
    
            int max = 0;
            for(String str: map.keySet()){
                int cnt = map.get(str);
                if(cnt>max)max=cnt; 
            }
            return max;
        }
    
        private boolean isVaild(String s,int maxLetters){
            Set<Character> set = new HashSet<>();
            for(char c: s.toCharArray()){
                set.add(c);
            }
    
            return set.size()<=maxLetters;
        }
    }
    
  • 相关阅读:
    Permutations II
    N-Queens II
    Palindrome Number
    Minimum Path Sum
    JS的DOM操作2
    JS 的DOM操作
    函数概念
    JavaScript数组
    JavaScript循环及练习
    JS语言
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/12932491.html
Copyright © 2011-2022 走看看