Leetcode 340. 至多包含 K 个不同字符的最长子串(滑动窗口)

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


示例 1:

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

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

【代码】:
滑动窗口思路。
注意时间复杂度的控制,如果无脑O(n^2)会超时。
我这里用hash优化到了O(n)

/**
 * @param {string} s
 * @param {number} k
 * @return {number}
 */ 

//滑动窗口。如果满足right++,扩大窗口。否则左边增加减小窗口
var lengthOfLongestSubstringKDistinct = function(s, k) {
    let left = 0;
    let right = 0;
    let arr = s.split("");
    let max = 0;
    let hash = new Map();
    hash.set(arr[0], 1);
    while(right < arr.length){    
        if(hash.size <= k){
            max = Math.max(max, right - left + 1);
            right++;
            let val = hash.get(arr[right]);
            val == undefined ? hash.set(arr[right],1) : hash.set(arr[right],val+1); 
        }else{
            let val = hash.get(arr[left]) - 1;
            val == 0 ? hash.delete(arr[left]) : hash.set(arr[left], val);
            left++;
        }
    }
    return max;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值