leetcode 340. Longest Substring with At Most K Distinct Characters

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;
    }
    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值