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

难度困难91收藏分享切换为英文接收动态反馈

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

示例 1:

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

示例 2:

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

思路:【滑动窗口+ hash】

创建一个map,不停把右边元素放进map,控制里面只有k个元素;每次移除最左边那个元素,map中存index, 每次遇到相同的key时直接把前面那个index覆盖,这样index中最小的就是最左边那个

Talk is cheap, show me the code

package mainimport "math"func main() {lengthOfLongestSubstringKDistinct("eceba", 2)
}func lengthOfLongestSubstringKDistinct(s string, k int) int {if s == "" || k == 0{return 0}m := make(map[string]int, 2)var res = 1left, right := 0, 0for right < len(s) {// value 为对应值对应的index索引m[string(s[right])]=rightright++// 如果窗口内的字符数超过了k,要滑动左边界让其回到k以内// 移去最左出现的字符,移动left指针使得滑动窗口只包含k个不同字符// 本题的核心处理:维护map中只有k个元素;每次移除最左边那个,// map中存index,每次遇到相同的key时直接把前面那个index覆盖,这样index中最小的就是最左边的if len(getKeys(m)) > k {// 选出value中最左边的进行删除minIndex := math.MaxInt64for _, value := range m {if value < minIndex {minIndex = value}}delete(m, string(s[minIndex]))// 左边跳转到加1left = minIndex + 1}if right - left > res {res = right-left}}for key, value := range m {if value == 0 {delete(m, key)}}print(res)return res
}func getKeys(m map[string]int) []string {// 数组默认长度为map长度,后面append时,不需要重新申请内存和拷贝,效率较高keys := make([]string, 0, len(m))for k, _ := range m {keys = append(keys, k)}return keys
}

【LeetCode430】至多包含 K 个不同字符的最长子串相关推荐

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

    给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出: 3 解释: 则 T 为 "ece ...

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

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出 ...

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

    340. 至多包含 K 个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringKDistinct(String s, int k) ...

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

    340. 至多包含 K 个不同字符的最长子串 难度:中等 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k ...

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

    1. 至多包含两个不同字符的最长子串 (1)滑动窗口 动态地维护一个滑动窗口,如果检测到窗口内出现了超过两个不同的字符,则将窗口整体右移一格. 否则,将滑动窗口向右扩张一格. 最后返回滑动窗口的长度 ...

  6. LeetCode算法日记:340.至多包含K个不同字符的最长子串

    340.至多包含K个不同字符的最长子串 日期:2022/7/30 题目描述:给定一个字符串 *s* ,找出 至多 包含 k 个不同字符的最长子串 *T*. 示例: 输入: s = "eceb ...

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

    题目:给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出: 3 解释: 则 T 为 " ...

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

    题目描述 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 样例描述 示例 1:输入: s = "eceba", k = 2 输出: 3 解释: 则 T 为 ...

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

    340. 至多包含 K 个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringKDistinct(String ss, int k ...

最新文章

  1. 计算当前日期是一年中的第几周
  2. [bbk5128]第12集 - Chapter 06- Working with Composite Data Types -01-4998(Record)
  3. 菜鸟级WEX5开发之路【用B/S开发经验应用到WEX5的开发中来】
  4. 自动化测试和手工测试
  5. UUID工具类及使用
  6. JavaScript 基本语法及面试注意点
  7. u-boot源码配置原理分析
  8. shell入门(二)——面试题实例
  9. java冒泡法优化_数据结构java版之冒泡排序及优化
  10. C++11 关键字override和final
  11. 中国1:100万土壤数据处理
  12. WEB专用服务器的安全设置
  13. C++二维vector初始化大小方法
  14. js禁止中文输入 最简洁的【禁止输入中文】
  15. 研发工程师历年企业笔试真题汇总
  16. 标准之争:影响 IPv6 部署的经济学因素
  17. 打印预览的线条粗细问题
  18. 点乘叉乘坐标公式_向量的点乘与叉乘应用
  19. css: 照片有如层叠效果
  20. 攻与防--论游戏好玩的本质

热门文章

  1. 程序员该如何把 Windows 系统打造的跟 Mac 一样牛逼?
  2. python3 excel 图表导出图片_使用python代码将excel中的图表导出为图片
  3. 没钱没资源没人脉?年入千万的她写了这本副业思维的书
  4. 【JY】知名显式动力学求解器Radioss宣布开源
  5. 最新 在线下载谷歌play apk 地址
  6. 小牛叔讲Python第10章:化繁为简的推导式
  7. 微信 for Windows 内测3.3.0版本,能刷朋友圈啦!
  8. echarts地图上的标签为图片_百度地图标记点中添加Echarts图表
  9. 逍遥模拟器调试模式设置
  10. Win10安装Ubuntu22.04后,The Windows Subsystem for Linux optional component is not enabled. Please enable