给定字符串S,找到最多有k个不同字符的最长子串T。
在线评测地址:LintCode 领扣
样例 1:
输入: S = "eceba" 并且 k = 3
输出: 4
解释: T = "eceb"
样例 2:
输入: S = "WORLD" 并且 k = 4
输出: 4
解释: T = "WORL" 或 "ORLD"
算法:同向双指针 + 哈希表
通过使用同向双指针的算法,我们可以做到一次遍历字符串就得到答案。 在字符串上移动滑动窗口,保证窗口内有不超过 k
个不同字符,同时在每一步更新最大子串长度。
- 如果字符串为空或者
k
是零的话返回 0。 - 设置指针为字符串开头
left
= 0 和right
= 0,初始化最大子串长度maxLen
= 1。 - 当
right
<N
时: - 将当前字符s[right]
加入哈希表并且向右移动right
指针。 - 如果哈希表包含k + 1
个不同字符,在哈希表中移去最左出现的字符(s[left]
),右移动left
指针使得滑动窗口只包含k
个不同字符。 - 更新maxLen = max(maxLen, right - left)
。
复杂度分析
- 时间复杂度
O(n)