leetcode 340. Longest Substring with At Most K Distinct Characters
下面的实现是很直观的,记下当前所包含的字符数,采用双指针进行移动
public class Solution {
public static void main(String[] args){
Solution s = new Solution();
s.lengthOfLongestSubstringKDistinct("abacccc", 2);
}
public int lengthOfLongestSubstringKDistinct(String s, int k) {
int size = s.length();
if(size<=k) return size;
if(k==0) return 0;
char[] chars = s.toCharArray();
int i=0,j=0;
int max = 0;
// HashSet<Character> bag = new HashSet<Character>();
HashMap<Character, Integer> bag = new HashMap<Character, Integer>();
// bag.add(chars[0]);
bag.put(chars[0], 1);
while(i<size&&j<size){
// System.out.println(bag.size());
if(bag.size()<=k){
max = max > (j-i+1) ? max :(j-i+1);
// System.out.println(max);
j++;
if(j<size) {
// bag.add(chars[j]);
if(bag.containsKey(chars[j]))
bag.put(chars[j], bag.get(chars[j])+1);
else
bag.put(chars[j], 1);
}
if(j==size) break;
}else{
i++;
if(i<size) {
// System.out.println(i);
// System.out.println(j);
bag.put(chars[i-1], bag.get(chars[i-1])-1);
if(bag.get(chars[i-1])==0)
bag.remove(chars[i-1]);
}
}
}
return max;
}
}
而下面这种解法,在i 自增的时候,不再是一步一步增,直接跳转到所有元素最右出现的位置的最小位置(有点绕,但是对的)
class Solution(object):
def lengthOfLongestSubstringKDistinct(self, s, k):
"""
:type s: str
:type k: int
:rtype: int
"""
d = {}
low, ret = 0, 0
for i, c in enumerate(s):
d[c] = i
if len(d) > k:
low = min(d.values())
print(low)
del d[s[low]]
print(d)
low += 1
ret = max(i - low + 1, ret)
return ret
java 版本
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
public class Solution {
public static void main(String[] args){
Solution s = new Solution();
s.lengthOfLongestSubstringKDistinct("abacccc", 2);
}
public int lengthOfLongestSubstringKDistinct(String s, int k) {
int size = s.length();
if(size<=k) return size;
if(k==0) return 0;
char[] chars = s.toCharArray();
int i=0,low=0;
int max = 0;
// HashSet<Character> bag = new HashSet<Character>();
HashMap<Character, Integer> bag = new HashMap<Character, Integer>();
// bag.add(chars[0]);
while(i<size){
bag.put(chars[i], i);
if(bag.size()>k){
low = findmin(bag);
bag.remove(chars[low]);
low = low + 1;
}
max = max>(i-low+1)?max:(i-low+1);
i+=1;
}
return max;
}
public int findmin(HashMap<Character, Integer> bag){
int min = Integer.MAX_VALUE;
for(Map.Entry<Character, Integer> entry: bag.entrySet()){
if(entry.getValue()<min){
min = entry.getValue();
}
}
return min;
}
}