Leetcode 395.至少有K个重复字符的最长子串 2021.02.27
二月 27, 2021
395. 至少有 K 个重复字符的最长子串
- 难度:中等
给你一个字符串
s
和一个整数k
,请你找出s
中的最长子串, 要求该子串中的每一字符出现次数都不少于k
。返回这一子串的长度。
示例
示例1:
输入:s = “aaabb”, k = 3
输出:3
解释:最长子串为 “aaa” ,其中 ‘a’ 重复了 3 次。
示例2:
输入:s = “ababbc”, k = 2
输出:5
解释:最长子串为 “ababb” ,其中 ‘a’ 重复了 2 次, ‘b’ 重复了 3 次。
说明
1 <= s.length <= 104
s
仅由小写英文字母组成1 <= k <= 105
思路
滑动窗口+双指针
charType
为假设的字符种类数charHash
为哈希数组less
为不足k的字符种类数typeTotal
为当前哈希数组内的字符种类数- 首先我们假设最长字串仅有一个字符符合题目要求,逐步增加,直至假设26个字符都符合题目
- 接着我们用左、右双指针指向字符串的头
- 如果右指针未到字符串的尾部
- 把右指针指向的字符加进一个哈希数组里
- 如果哈希数组对应字符的值为1,说明刚才这个值是新加进去的,刚才并没有这个值,则
less
、typeTotal
均加1 - 如果哈希数组对应字符的值为k,说明这个数达到k的要求了,
less
就能减1
- 如果哈希数组对应字符的值为1,说明刚才这个值是新加进去的,刚才并没有这个值,则
- 如果当前哈希数组内的字符种类数超出我们假设的字符种类数,我们便把左指针指向的字符从哈希数组中减去,直至
typeTotal
≤charType
- 如果哈希数组对应字符的值为k-1,说明这个字符刚才符合k的要求,现在缺不符合了,
less
需要加1 - 如果哈希数组对应字符的值为0,说明这个字符现在不存在我们的窗口内了,
less
、typeTotal
均需要减1 - 左移左指针
- 如果哈希数组对应字符的值为k-1,说明这个字符刚才符合k的要求,现在缺不符合了,
- 当
less
等于0,说明窗口内的字符符合题目要求,与以往的字串比较,取最长的。 - 左移右指针
- 把右指针指向的字符加进一个哈希数组里
代码实现
1 | int longestSubstring(string s, int k) { |
查看评论