Slicing Window1
2
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
37
38
39
40
41
42
43
44
45
46
47// import java.util.*;
class Solution {
    static List<String> atMostK(String s, int k){
        int start=0,end=0;
        List<String> ls=new ArrayList<>();
        Map<Character,Integer> map=new HashMap<>();
        while(end<s.length()){
            char chEnd=s.charAt(end);
            if(map.containsKey(chEnd)) {
                int pos=map.get(chEnd);
                for(int i=start;i<=pos;i++){
                    map.remove(s.charAt(i));
                }
                start=pos+1;
            }
            map.put(chEnd,end);
            end++;
            while(map.size()>k){
                char chStart=s.charAt(start);
                map.remove(chStart);
                start++;
            }
            String newStr=s.substring(start,end);
            if(!ls.contains(newStr)) ls.add(newStr);
        }
        return ls;
    }
    static List<String> distinctK(String s,int k){
        List<String> lsAtMostK=new ArrayList<>(atMostK(s, k));
        for(String str:atMostK(s,k-1)) lsAtMostK.remove(str);
        return lsAtMostK;
    }
}
/*
public class MyClass {
    public static void main(String[] args) {
        String s="awaglknagawunagwkwagl";
        int k=4;
        System.out.println("\nString: "+s+", k: "+k);
        System.out.println(Solution.distinctK(s, k));
        String s1="abacab";
        int k1=3;
        System.out.println("\nString: "+s1+", k: "+k1);
        System.out.println(Solution.distinctK(s1, k1));
    }
}*/
