Take K of Each Character From Left and Right

MediumHash TableStringSliding Window

Solution

export function takeCharacters(s: string, k: number): number {
  const n = s.length;
  const freqs = new CharCounter(s);
  for (const char of 'abc') {
    if (freqs.get(char) < k) {
      return -1;
    }
  }
 
  let left = 0;
  let maxWindow = 0;
  const counter = new CharCounter();
  for (let right = 0; right < n; right++) {
    const char = s[right];
    counter.add(char);
    while (freqs.get(char) - k < counter.get(char)) {
      counter.sub(s[left]);
      left += 1;
    }
    maxWindow = Math.max(maxWindow, right - left + 1);
  }
  return n - maxWindow;
}
 
class CharCounter extends Map<string, number> {
  constructor(values: string | string[] = []) {
    super();
    for (const value of values) {
      this.add(value);
    }
  }
 
  get(key: string): number {
    return super.get(key) ?? 0;
  }
 
  add(key: string): void {
    super.set(key, this.get(key) + 1);
  }
 
  sub(key: string): void {
    super.set(key, this.get(key) - 1);
  }
}

Complexity

  • Time: O(n)O(n)
  • Space: O(1)O(1)