1048. Longest String Chain

https://leetcode.com/problems/longest-string-chain/

You are given an array of words where each word consists of lowercase English letters. wordA is a predecessor of wordB if and only if we can insert exactly one letter anywhere in wordA without changing the order of the other characters to make it equal to wordB.

For example, "abc" is a **predecessor** of "abac", while "cba" is not a **predecessor** of "bcad".A **word chain**__ __is a sequence of words [word1, word2, ..., wordk] with k >= 1, where word1 is a **predecessor** of word2, word2 is a **predecessor** of word3, and so on. A single word is trivially a **word chain** with k == 1.

Return __the length of the longest possible word chain with words chosen from the given list of __words.

Example 1: Input: words = [“a”,“b”,“ba”,“bca”,“bda”,“bdca”] Output: 4 Explanation: One of the longest word chains is [“a”,“ba”,“bda”,“bdca”]. Example 2: Input: words = [“xbc”,“pcxbcf”,“xb”,“cxbc”,“pcxbc”] Output: 5 Explanation: All the words can be put in a word chain [“xb”, “xbc”, “cxbc”, “pcxbc”, “pcxbcf”]. Example 3: Input: words = [“abcd”,“dbqca”] Output: 1 Explanation: The trivial word chain [“abcd”] is one of the longest word chains. [“abcd”,“dbqca”] is not a valid word chain because the ordering of the letters is changed.

Constraints:

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

  • code
class Solution:
    def longestStrChain(self, words: List[str]) -> int:
        words_set = set(words)
        
        @lru_cache
        def dfs(word):
            max_len = 1
            for i in range(len(word)):
                nexword = word[:i] + word[i+1:]
                if nexword in words_set:
                    cur_len = 1 + dfs(nexword)
                    max_len = max(cur_len, max_len)
            return max_len
        
        res = 0
        for word in words:
            res = max(res, dfs(word))
            
        return res