Given a string s and an integer k, return the length of the longest substring of s that contains at most k distinct characters.
Example 1:
Input: s = “eceba”, k = 2
Output: 3
Explanation: The substring is “ece” with length 3.
Example 2:
Input: s = “aa”, k = 1
Output: 2
Explanation: The substring is “aa” with length 2.
Constraints:
1 <= s.length <= 5 * 104
0 <= k <= 50
至多包含K个不同字符的最长子串。
思路
这个题跟 159 题一模一样,无非是把最多两个字母改成了最多 K 个字母。还是 sliding window 的思路做。不熟悉的话可以先做 159 题。
复杂度
时间O(n)
空间O(1) - 只是一个256位长度的数组
代码
Java实现
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 
 | class Solution {public int lengthOfLongestSubstringKDistinct(String s, int k) {
 int[] map = new int[256];
 int start = 0;
 int end = 0;
 int res = Integer.MIN_VALUE;
 int counter = 0;
 while (end < s.length()) {
 char c1 = s.charAt(end);
 if (map[c1] == 0) {
 counter++;
 }
 map[c1]++;
 end++;
 while (counter > k) {
 char c2 = s.charAt(start);
 map[c2]--;
 if (map[c2] == 0) {
 counter--;
 }
 start++;
 }
 res = Math.max(res, end - start);
 }
 return res;
 }
 }
 
 | 
JavaScript实现
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 
 | 
 
 
 
 var lengthOfLongestSubstringKDistinct = function(s, k) {
 
 if (s == null || s.length == 0) {
 return 0;
 }
 
 
 let start = 0;
 let end = 0;
 let maxLen = -Infinity;
 let counter = 0;
 let map = {};
 while (end < s.length) {
 let c1 = s.charAt(end);
 if (map[c1] == null || map[c1] <= 0) {
 counter++;
 }
 map[c1] = map[c1] + 1 || 1;
 end++;
 while (counter > k) {
 let c2 = s.charAt(start);
 if (map[c2] == 1) {
 counter--;
 }
 map[c2]--;
 start++;
 }
 maxLen = Math.max(maxLen, end - start);
 }
 return maxLen;
 };
 
 |