Given a string S, find the length of the longest substring T that contains at most k distinct characters.
Example
Example 1:
Input: S = "eceba" and k = 3
Output: 4
Explanation: T = "eceb"
Example 2:
Input: S = "WORLD" and k = 4
Output: 4
Explanation: T = "WORL" or "ORLD"
Challenge
O(n) time
分析
这道题在LeetCode上加锁了,在lintCode上有原题。
很简单,双指针遍历整个string,使用map<char, int>记录此时字符出现的次数,当map的size没有超过k时,right指针向后移动;当map的size大于k时,此时left指针向后移动,知道map的size <= k为止。
Code
class Solution {
public:
/**
* @param s: A string
* @param k: An integer
* @return: An integer
*/
int lengthOfLongestSubstringKDistinct(string &s, int k) {
// write your code here
int len = s.size();
map<char, int> m;
int i = 0;
int j = 0;
int res = 0;
while (j < len)
{
if(m.find(s[j]) == m.end())
m[s[j]] = 0;
m[s[j]] ++;
while (m.size() > k)
{
m[s[i]] --;
if (m[s[i]] == 0)
m.erase(s[i]);
i ++;
}
res = max(res, j-i + 1);
j ++;
}
return res;
}
};
运行效率
Your submission beats 6.40% Submissions!