题目描述
给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T。
示例
示例 1:
输入: s = "eceba", k = 2
输出: 3
解释: 则 T 为 "ece",所以长度为 3。
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/lo…
实现
int lengthOfLongestSubstringKDistinct(char *s, int k)
{
if (k < 1) {
return k;
}
int sum = 0; // 标记当前符合题意的字符串长度
int left = 0;
int right = 0;
int hash[128] = {0};
int curLen = 0;
int maxLen = 0;
while (right < strlen(s)) {
hash[s[right]]++;
if (hash[s[right]] == 1) { // 说明是第一次遇到该字符串,sum++
sum++;
if (sum > k) { // 不重复的字符个数已经超过标准,左指针右移
while (hash[s[left]] > 1) { // 当其出现次数比1大时,left右移一位后当前字符串中不同的字符数仍然大于k,因此用while
hash[s[left]]--;
left++;
}
// 此时left位置的元素只有1个,当left右移后,sum--,与k相同了,right又可以向右尝试
hash[s[left]]--;
left++;
sum--;
}
}
curLen = right - left + 1;
maxLen = curLen > maxLen ? curLen : maxLen;
right++;
}
return maxLen;
}