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;
}