美文网首页
最多包含k个不同字符的最长子串

最多包含k个不同字符的最长子串

作者: asdfgjsrgdf | 来源:发表于2020-04-10 12:14 被阅读0次

    题目

    实现函数:输入一个字符串str,一个int值k,输出str中最多含有k个字符的子串最大长度.例如str="aabc",k="2",则输出3,因为最长含2个字符的子串是"aab"

    解决

    1. 暴力法
      i遍历字符串,考察以i开头的子串满足条件的最大长度,时间复杂度为O(n^2)
    2. 暴力法
      遍历str的所有子串(从长到短),考察其是否满足条件,时间复杂度为O(n^2)
    3. HashMap+快慢指针
      利用map记录子串中每个字符的数量、利用快慢指针进行遍历,分别代表子串的结尾j与开头i
      快指针将指向的字符计入map,若此时map.size>k,则移动慢指针(砍掉子串的开头),直至map.size()恢复正常,快指针继续向前(增加子串的结尾)。这一过程中j-i+1的最大值即为答案

    代码

    public static int find(String str, int k){
            HashMap<Character,Integer> map = new HashMap<>();
            int max = 0;
            for (int j=0,i=0;j<str.length();j++){
                char toPut = str.charAt(j);
                map.put(toPut,map.getOrDefault(toPut, 0)+1);
                while (map.size()>k){
                    char temp = str.charAt(i);
                    map.put(temp, map.get(temp)-1);//利用map键唯一的特点,通过put实现值修改
                    if (map.get(temp)==0)
                        map.remove(temp);
                    i ++;
                }
                max = Math.max(max,j-i+1);
            }
            return max;
        }
    

    相关文章

      网友评论

          本文标题:最多包含k个不同字符的最长子串

          本文链接:https://www.haomeiwen.com/subject/ymtrmhtx.html