码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode]子串的最大出现次数(字符串)

时间:2020-05-21 19:07:21      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:put   return   ring   length   必须   code   ash   维护   get   

题目

给你一个字符串?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;
    }
}

[LeetCode]子串的最大出现次数(字符串)

标签:put   return   ring   length   必须   code   ash   维护   get   

原文地址:https://www.cnblogs.com/coding-gaga/p/12932491.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!