思路:
使用一个窗口框出子串, 判断如果窗口内字符个数小于等于k,则右边界增加扩大窗口。若窗口内字符个数大于k,则左边界增加减小窗口内数据。每次记录窗口size,获取最大值,若最大值小于k,则没有满足条件的字串,返回0.

代码如下:
In [1]: def longest_sub_string_with_k_distinct(string, k):
...: max_len = 0
...: left, right, end = 0, k, len(string)
...:
...: # 判断子串是否大于k个不同字符
...: def is_k_distinct(s):
...: return len(set(s)) <= k
...:
...: while right <= end:
...: if is_k_distinct(string[left:right]):
...: max_len = max(max_len, len(string[left:right]))
...: print(string[left:right])
...: right += 1
...: else:
...: left +=1
...: return max_len if max_len >= k else 0
In [2]: longest_sub_string_with_k_distinct("cbbebix", 3)
cbb
cbbe
cbbeb
bbebi
bix
Out[2]: 5
该博客介绍了如何使用滑动窗口算法解决寻找字符串中最长子串,其中包含不超过k个不同字符的问题。通过维护一个窗口,并调整左右边界来更新最大长度,最终找到满足条件的最长子串。
1451

被折叠的 条评论
为什么被折叠?



