240921-340至多包含K个不同字符的最长字串

52 阅读1分钟

给你一个字符串 s 和一个整数 k ,请你找出 至多 包含 k 个 不同 字符的最长子串,并返回该子串的长度。

示例 1:

输入: s = "eceba", k = 2
输出: 3
解释: 满足题目要求的子串是 "ece" ,长度为 3 。

示例 2:

输入: s = "aa", k = 1
输出: 2
解释: 满足题目要求的子串是 "aa" ,长度为 2 。

思路

可以穷举所有字串得到解--换滑动窗口法--收缩左边界的条件是当前窗口不重复元素个数大于k

个人题解

class Solution {
    public int lengthOfLongestSubstringKDistinct(String s, int k) {
        //暴力穷举----优化:滑动窗口,收缩左边界条件是出现重复字符
        char[] windows = new char[128];
        int left = 0;
        int right = 0;
        int res = -1;
        //用curSize记录当前窗口中不重复的字符个数
        int curSize = 0;

        while (right < s.length()) {
            if (windows[s.charAt(right)] == 0)
                curSize++;
            windows[s.charAt(right)]++;

            //curSize超过k时候就不满足要求,开始收缩左边界直到窗口符合要求
            while (curSize > k) {
                windows[s.charAt(left)]--;
                if (windows[s.charAt(left)] == 0)
                    curSize--;
                left++;
            }
            //每次窗口符合要求时候都要更新最长字串
            res = Math.max(res, right - left + 1);
            right++;
        }
        return res;
    }

}