思路:
使用一个窗口框出子串, 判断如果窗口内字符个数小于等于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