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

本文介绍了如何使用滑动窗口和哈希映射解决寻找字符串中至多包含k个不同字符的最长子串的问题。通过维护一个只包含k个元素的哈希映射,不断移动窗口边界,找到符合条件的最长子串。示例代码展示了具体的实现过程,包括在Python中如何操作字符串和哈希映射来达到目标。
摘要由CSDN通过智能技术生成

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 main

import "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 = 1
	left, right := 0, 0
	for right < len(s) {
		// value 为对应值对应的index索引
		m[string(s[right])]=right
		right++
		// 如果窗口内的字符数超过了k,要滑动左边界让其回到k以内
		// 移去最左出现的字符,移动left指针使得滑动窗口只包含k个不同字符
		// 本题的核心处理:维护map中只有k个元素;每次移除最左边那个,
		// map中存index,每次遇到相同的key时直接把前面那个index覆盖,这样index中最小的就是最左边的
		if len(getKeys(m)) > k {
			// 选出value中最左边的进行删除
			minIndex := math.MaxInt64
			for _, value := range m {
				if value < minIndex {
					minIndex = value
				}
			}
			delete(m, string(s[minIndex]))
			// 左边跳转到加1
			left = 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
}
 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值