Longest String Chain

MediumArrayHash TableTwo PointersStringDynamic ProgrammingSorting

Solution

class Counter {
  private readonly map: Map<string, number>;
  constructor() {
    this.map = new Map();
  }
 
  has(key: string): boolean {
    return this.map.has(key);
  }
 
  get(key: string): number {
    return this.map.get(key) ?? 0;
  }
 
  set(key: string, value: number): void {
    this.map.set(key, value);
  }
}
 
export function longestStrChain(words: string[]): number {
  const dp = new Counter();
  const removeCharFromWord = (word: string, index: number) => {
    return word.slice(0, index) + word.slice(index + 1, word.length);
  };
 
  let answer = 1;
  Array.from(words)
    .sort((a, b) => a.length - b.length)
    .forEach((word) => {
      dp.set(word, 1);
      for (let i = 0; i < word.length; i++) {
        const removedWord = removeCharFromWord(word, i);
        if (dp.get(word) <= dp.get(removedWord)) {
          dp.set(word, dp.get(removedWord) + 1);
        }
      }
      answer = Math.max(answer, dp.get(word));
    });
  return answer;
}