The problem can be solved in O(n). Idea is to maintain a window andadd elements tothe window till itcontains less or equal k, update our resultif required while doing so. If unique elements exceeds than required in window, start removing the elements from left side.
Use a hashmap to maintain thesetof distinct charinthe sliding window andthe count, maintain the starting index ofthe
publicstatic String unique2CharSubstring(String str, int k) {
String result = "";
int len = str.length();
HashMap<character, integer=""> map = new HashMap<character, integer="">();
char[] c = str.toCharArray();
int right = 0, max = 0;
LinkedList<character> queue = new LinkedList<character>();
//dont use the queue here, use hashmap with a countfor (int left = 0; left < len; left++) {
while (right < len) {
if (!map.containsKey(c[right])) {
queue.add(c[right]);
}
map.put(c[right], right);
if (map.size() > k) {
left = Math.max(left, map.get(queue.peek()) + 1);
map.remove(queue.pop());
}
if (right - left > max) {
max = right - left;
result = str.substring(left, right + 1);
}
right++;
}
}
return result;
}