# LeetCode 340. Longest Substring with At Most K Distinct Characters（最长字串）

Given a string, find the length of the longest substring T that contains at most k distinct characters.

For example, Given s = “eceba” and k = 2,

T is "ece" which its length is 3.

public class Solution {
public int lengthOfLongestSubstringKDistinct(String s, int k) {
if (s == null) return 0;
int from = 0;
int[] histogram = new int[256];
int distinct = 0;
char[] sa = s.toCharArray();
int max = 0;
for(int i=0; i<sa.length; i++) {
if (histogram[sa[i]] == 0) distinct ++;
histogram[sa[i]] ++;
while (distinct > k) {
histogram[sa[from]] --;
if (histogram[sa[from]] == 0) distinct --;
from ++;
}
max = Math.max(max, i-from+1);
}
return max;
}
}

public class Solution {
public int lengthOfLongestSubstringKDistinct(String s, int k) {
int from = 0;
int max = 0;
char[] sa = s.toCharArray();
int[] f = new int[256];
int d = 0;
for(int i=0; i<sa.length; i++) {
if (f[sa[i]]++ == 0) d++;
while (d>k && from<=i) {
if (f[sa[from]]==1) d--;
f[sa[from++]]--;
}
max = Math.max(max, i-from+1);
}
return max;
}
}

public class Solution {
public int lengthOfLongestSubstringKDistinct(String s, int k) {
if (k <= 0) return 0;
int[] f = new int[256];
int distinct = 0;
char[] sa = s.toCharArray();
int from = 0;
int max = 0;
for(int i=0; i<sa.length; i++) {
if (f[sa[i]] ++ == 0) distinct ++;
while (distinct > k) {
if (--f[sa[from++]] == 0) distinct --;
}
max = Math.max(max, i-from+1);
}
return max;
}
}

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120