​LeetCode刷题实战340:至多包含 K 个不同字符的最长子串

程序IT圈

共 2488字,需浏览 5分钟

 ·

2021-08-05 01:37

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 至多包含 K 个不同字符的最长子串,我们先来看题面:
https://leetcode-cn.com/problems/longest-substring-with-at-most-k-distinct-characters/

Given a string, find the length of the longest substring T that contains at most k distinct characters.

定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T。

示例


示例 1:

输入: s = "eceba", k = 2
输出: 3
解释: 则 T 为 "ece",所以长度为 3

示例 2:

输入: s = "aa", k = 1
输出: 2
解释: 则 T 为 "aa",所以长度为 2


解题

双指针,指针中间的是可能的答案。符合要求右指针向右扩,否则更新答案,左指针往右缩。


class Solution {
  public int lengthOfLongestSubstringKDistinct(String s, int k) {
    int n = s.length();
    if (n < k+1) return n;
 
    int left = 0;
    int right = 0;
    //K-V:K是对应字符,V是最后一次出现的位置。
    HashMap<Character, Integer> hashmap = new HashMap<Character, Integer>();
 
    int max_len = 0;
 
    while (right < n) {
        //符合要求就继续向右扩
        if (hashmap.size() < k+1){
            hashmap.put(s.charAt(right), right++);
        }
        if (hashmap.size() == k+1) {
            int index = Collections.min(hashmap.values());
            hashmap.remove(s.charAt(index));
            left = index + 1;
        }
      max_len = Math.max(max_len, right - left);
    }
    return max_len;
  }
}


好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-320题汇总,希望对你有点帮助!
LeetCode刷题实战321:拼接最大数
LeetCode刷题实战322:零钱兑换
LeetCode刷题实战323:无向图中连通分量的数目
LeetCode刷题实战324:摆动排序 II
LeetCode刷题实战325:和等于 k 的最长子数组长度
LeetCode刷题实战326:3的幂
LeetCode刷题实战327:区间和的个数
LeetCode刷题实战328:奇偶链表
LeetCode刷题实战329:矩阵中的最长递增路径
LeetCode刷题实战330:按要求补齐数组
LeetCode刷题实战331:验证二叉树的前序序列化
LeetCode刷题实战332:重新安排行程

浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报