[LC] 340. Longest Substring with At Most K Distinct Characters

我感觉不到这一题和https://blog.csdn.net/chaochen1407/article/details/44041185 有什么本质上的差别。基本都是一样的思想,用快慢指针维护一个窗口,快指针就走最普通的for循环遍历方式,然后根据窗口里面的内容确定是否推进慢指针,如果窗口里面的distinct characters已经多于k个,就开始前移慢指针缩小窗口直到窗口内的独立的字符不多于k个。统计独立字符就依靠一个HashMap<Character, Integer>或者一个int数组都行。统计窗口内的字符的个数,当出现新字符的时候(也就是字符的个数从0变成1)独立的字符的个数就加一,就这样,解法就是把上面那个链接的解法从2变成n。

    public int lengthOfLongestSubstringKDistinct(String s, int k) {
        int head = 0;
        int result = 0; 
        int curCnt = 0;
        int[] chMap = new int[256];
        for (int i = 0; i < s.length(); i++) {
            int chIdx = s.charAt(i);
            chMap[chIdx]++;
            if (chMap[chIdx] == 1) {
                curCnt++;
            }

            while (curCnt > k) {
                chIdx = s.charAt(head);
                chMap[chIdx]--;
                if (chMap[chIdx] == 0) curCnt--;
                head++;
            }

            result = Math.max(result, i - head + 1);
            
        }
        
        return result;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值