算法题:至多包含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;
    }
相关推荐
Code小翊20 小时前
希尔排序基础理解
数据结构·算法·排序算法
_dindong20 小时前
笔试强训:Week -2
笔记·学习·算法
Pluchon20 小时前
硅基计划4.0 算法 二叉树深搜(DFS)
java·数据结构·算法·leetcode·深度优先·剪枝
颜酱20 小时前
用导游的例子来理解 Visitor 模式,实现AST 转换
前端·javascript·算法
CUC-MenG20 小时前
2025牛客国庆集训派对day7 M C 个人题解
数学·算法·线段树·差分·扫描线
远远远远子21 小时前
C++-- 内存管理
c++·算法
sprintzer21 小时前
10.6-10.15力扣模拟刷题
算法·leetcode·职场和发展
徐子童21 小时前
算法---队列+宽搜
算法··队列·层序遍历
一念&21 小时前
每日一个C语言知识:C 数组
c语言·开发语言·算法
小年糕是糕手21 小时前
【数据结构】单链表“0”基础知识讲解 + 实战演练
c语言·开发语言·数据结构·c++·学习·算法·链表