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

2024-08-24 20:08

本文主要是介绍【LeetCode430】至多包含 K 个不同字符的最长子串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 个不同字符的最长子串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103472

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st