Remove Duplicate Letters

MediumStringStackGreedyMonotonic Stack

Solution

export function removeDuplicateLetters(s: string): string {
  const lastIndicies = new Map<string, number>();
  for (let i = 0; i < s.length; i++) {
    lastIndicies.set(s[i], i);
  }
 
  const stack: string[] = [];
  const inStack = new Set<string>();
  for (let i = 0; i < s.length; i++) {
    const char = s[i];
    if (inStack.has(char)) {
      continue;
    }
    while (
      0 < stack.length &&
      char < stack[stack.length - 1] &&
      i < (lastIndicies.get(stack[stack.length - 1]) ?? 0)
    ) {
      inStack.delete(stack[stack.length - 1]);
      stack.pop();
    }
    stack.push(char);
    inStack.add(char);
  }
 
  return stack.join('');
}