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;
}
Find the longest substring with k unique distinct characters in a given string (Google)
The problem can be solved in O(n). Idea is to maintain a window and add elements to the window till it contains less or equal k, update our result if required while doing so. If unique elements exceeds