【LeetCode】340.至多包含 K 个不同字符的最长子串

340.至多包含 K 个不同字符的最长子串

知识点:字符串;滑动窗口

题目描述

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

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

解法一:滑动窗口

这其实也是滑动窗口的一道典型题目
刚看题目,最长子串,其实应该自然的想到滑动窗口。 最大,往往都是right向右移动寻找最优解,然后破坏了条件,然后left移动,缩小窗口,继续形成可行解;
对应到这道题目:
1.right右移,试图寻找一个最长窗口,直至破坏了条件,也就是包含了大于k个字符

步骤一我们需要在窗口内含有第三个字符的时候停下来,自然想到了哈希表,当哈希表长度为3的时候,证明第k+1个字符出现了 这时候就需要去移动左窗口了

2.left开始移动,缩小窗口

left移动到哪个位置呢?我们的目的是让left移动后窗口重新满足条件,也就是只有k个字符, 所以需要把一个字符移出去,也就是移到索引最小的位置+1例如例1,需要移动到c后面,而不能移动到第2个e后面,所以哈希表的value值应该是字符c最后一次出现的索引, 而我们要的就是找到这两个字符谁的索引小,所以可以直接对其value形成的list进行排序,取第一个即可。

在这个过程中不断的更新最大窗口值

class resolution: def getKlongestsubstr(self, s, k): left = 0 maxlen = 0 hashtable = {} for i, cur_str in enumerate(s): hashtable[cur_str] = i if len(hashtable) > k: index = sorted(hashtable.values())[0] # 移出去最左边的元素 hashtable.pop(s[index]) #删除指定键的值 left = index + 1 maxlen = max(maxlen, i-left+1) return maxlen

相关题目

159.至多包含两个不同字符的最长子串


__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/16128992.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(385)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『【LeetCode】340.至多包含 K 个不同字符的最长子串』
点击右上角即可分享
微信分享提示