算法题:至多包含K个不同字符的最长子串

1.题目描述

给定一个字符串,求包含K个不同字符的最长字串的长度。

比如字符串"qeceba",K=3,那么最长子串为"qece",长度为4。

比如字符串"cvbnteeeeqeee",K=3,最长子串为'teeeeqeee",长度为9。

2.原题链接

LeetCode-340. 至多包含K个不同字符的最长子串【付费-Plus会员专享题】

NC-356. 至多包含K种字符的子串【免费】

3.解题思路

java 复制代码
public static int longestSubstring(String str, int k) {
        int longestSubstringLength = 0;
        int substringStartIndex = -1;
        Deque<Character> uniunCharDeque = new ArrayDeque<>();
        Map<Character, Integer> charIndexMap = new HashMap<>();
        char[] arr = str.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            char c = arr[i];

            //1.记录每个字符最新的位置:特别是针对重复的字符,需要更新其最新的位置,用来定位最新子串的起点。
            charIndexMap.put(c, i);

            //2.判断是否需要构建新的子串。
            if (uniunCharDeque.contains(c)) {
                //2.1不需要:当前队列已经有该字符,所以无需构建新的字串,但是需要刷新该字符在队列中的位置(通过删除再重新添加来实现刷新)。
                uniunCharDeque.remove(c);
            } else {
                //2.2需要:当前子串中不包含当前字符,且队列中同步字符的数量已经达到阈值了,因此需要构建新的子串。
                if (uniunCharDeque.size() >= k) {
                    //2.2.1 更新队列中的字符:由于将会新添加一个字符进来,因此需要移除队列中最早的字符。
                    Character first = uniunCharDeque.removeFirst();
                    //2.2.2 更新新子串的起点:新子串的起点就是队列中被移除的那个最早字符的最新位置。
                    substringStartIndex = charIndexMap.get(first);
                }
            }

            //3.将当前字符放进队列。
            uniunCharDeque.offer(c);

            //4.刷新子串的最大长度:i表示当前位置,也就是当前子串的终点,start表示当前子串的起点。
            longestSubstringLength = Math.max(longestSubstringLength, (i - substringStartIndex));
        }
        return longestSubstringLength;
    }
相关推荐
hn小菜鸡5 分钟前
LeetCode 3370.仅含置位位的最小整数
算法·leetcode
r0ysue_5 小时前
02.上帝之心算法用GPU计算提速50倍
算法·gpu
L_cl5 小时前
【Python 算法零基础 4.排序 ⑦ 桶排序】
数据结构·算法·排序算法
小O的算法实验室6 小时前
2025年AIR SCI1区TOP,多策略增强蜣螂算法MDBO+实际工程问题,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
花自向阳开10247 小时前
LeetCode hot100-11
数据结构·算法·leetcode
月亮被咬碎成星星7 小时前
LeetCode[404]左叶子之和
算法·leetcode
有梦想的骇客7 小时前
书籍在其他数都出现k次的数组中找到只出现一次的数(7)0603
算法
jiet_h8 小时前
Android Kotlin 算法详解:链表相关
android·算法·kotlin
数据潜水员8 小时前
C#基础语法
java·jvm·算法
鸽子炖汤9 小时前
LRC and VIP
c++·算法·图论