Longest String Chain

LeetCode Q 1048 - Longest String Chain

Given a list of words, each word consists of English lowercase letters.
Let’s say word1 is a predecessor of word2 if and only if we can add exactly one letter anywhere in word1 to make it equal to word2. For example, "abc" is a predecessor of "abac".
A word chain is a sequence of words [word_1, word_2, ..., word_k] with k >= 1, where word_1 is a predecessor of word_2, word_2 is a predecessor of word_3, and so on.
Return the longest possible length of a word chain with words chosen from the given list of words.

Example 1: Input: ["a","b","ba","bca","bda","bdca"] ; Output: 4
Explanation: one of the longest word chain is “a”,”ba”,”bda”,”bdca”.

Note:

  • 1 <= words.length <= 1000
  • 1 <= words[i].length <= 16
  • words[i] only consists of English lowercase letters.

Solution

Code:

public int longestStrChain(String[] words) {
  Arrays.sort(words, (a, b) -> (a.length() - b.length()));

  Map<String, Integer> map = new HashMap<>();
  
  int len = words.length, max = 0;

  for (String word: words) {
    if (map.containsKey(word)) continue; // this step is important

    map.put(word, 1);

    for (int i = 0; i < word.length(); i++) {
      StringBuilder sb = new StringBuilder(word);
      String modified = sb.deleteCharAt(i);
      if (map.containsKey(modified) && map.get(modified) + 1 > map.get(word))
        map.put(word, map.get(modified) + 1);
    }

    max = Math.max(max, map.get(word));
  }

  return max;
}

   Reprint policy


《Longest String Chain》 by Tong Shi is licensed under a Creative Commons Attribution 4.0 International License
  TOC