340. 至多包含 K 个不同字符的最长子串

649 阅读1分钟

题目描述

给定一个字符串 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;
}