Minimum Window Substring

HardHash TableStringSliding Window

Solution

class CharCounter {
  private readonly counter: Map<string, number>;
 
  constructor(str: string) {
    this.counter = new Map();
    for (const char of str) {
      this.add(char);
    }
  }
 
  get(char: string): number {
    return this.counter.get(char) ?? 0;
  }
 
  add(char: string): void {
    this.counter.set(char, this.get(char) + 1);
  }
 
  sub(char: string): void {
    this.counter.set(char, this.get(char) - 1);
  }
}
 
export function minWindow(s: string, t: string): string {
  if (s.length === 0 || t.length === 0 || s.length < t.length) {
    return '';
  }
 
  let answer = '';
  const charCounter = new CharCounter(t);
 
  let start = 0;
  let remainChars = t.length;
  for (let end = 0; end < s.length; end++) {
    const char = s[end];
    if (0 < charCounter.get(char)) {
      remainChars -= 1;
    }
    charCounter.sub(char);
 
    while (remainChars === 0) {
      if (answer === '' || end - start + 1 < answer.length) {
        answer = s.substring(start, end + 1);
      }
      charCounter.add(s[start]);
      if (0 < charCounter.get(s[start])) {
        remainChars += 1;
      }
      start += 1;
    }
  }
 
  return answer;
}