问题描述:给定一个字符串s,找到至多包含k个不同字符得最长子串的长度。
比如s="cebea",k=2,那么输出结果就是3,因为此时"ebe"满足条件:至多包含两个不同字符,且子串最长
比如s="world",k=4,那么输出结果就是4,因为"worl"和"orld"满足条件:至多包含4个不同字符,且子串最长
class Solution: def lengthOfLongestSubstringKdistinct(self,s,k): tmp = 0 #用于记录满足条件得最大值 for i in range(1,len(s)+1):步长从1到len(s)+1 for j in range(len(s)-i+1):窗口左端 print(s[j:j+i]) if len(set(s[j:j+i])) == k:如果窗口中取集合后的不同字符就是k个 tmp = max(tmp,i)更新tmp的值 print("tmp:{}".format(tmp)) return tmp 最后返回即可
过程:
c
e
b
e
a
ce
tmp:2
eb
tmp:2
be
tmp:2
ea
tmp:2
ceb
ebe
tmp:3
bea
cebe
ebea
cebea
第二种方法:
思路: 一个hash表和一个左边界标记. 遍历字符串将其加入到hash表中, 不同字符多于k个了, 就从左边开始删字符. 直到hash表不同字符长度等于k.此时字符串的长度就是当前字符和左边界的距离。from collections import defaultdict 使用python中的collections.defaultdict 字典中存储的整型的值默认为0 hash = defaultdict(int) max_num = 0 用于存放最大值 start = 0 滑动窗口的左端 从字符串左开始遍历 in range(len(s)): 遍历到一个字符,使得字典中对应得字符加1 hash[s[i]] += 1 while len(hash)>k: hash[s[start]] -= 1 if hash[s[start]] == 0: del hash[s[start]] start += 1 max_num = max(max_num,i-start+1) return max_num
由于leetcode没会员,不能解锁,不能保证能过。但思路应该没问题。
总结以上是内存溢出为你收集整理的【python-leetcode340-滑动窗口法】至多包含 K 个不同字符的最长子串 全部内容,希望文章能够帮你解决【python-leetcode340-滑动窗口法】至多包含 K 个不同字符的最长子串 所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)