题目
给出一个单词列表,其中每个单词都由小写英文字母组成。
如果我们可以在 word1 的任何地方添加一个字母使其变成 word2,那么我们认为 word1 是 word2 的前身。例如,“abc” 是 “abac” 的前身。
词链是单词 [word_1, word_2, …, word_k] 组成的序列,k >= 1,其中 word_1 是 word_2 的前身,word_2 是 word_3 的前身,依此类推。
从给定单词列表 words 中选择单词组成词链,返回词链的最长可能长度。
链接:https://leetcode.com/problems/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:
Input: [“a”,“b”,“ba”,“bca”,“bda”,“bdca”]
Output: 4
Explanation: one of the longest word chain is “a”,“ba”,“bda”,“bdca”.
思路及代码
DP
- 先把所有的words按照长度进行sort
- dp[i]:包含第i个单词在内的最长链
- dp[i] = max(dp[j]) + 1,其中j<i且words[j]是words[i]的前缀
- 另外,在判断是否是前缀时:(1)pre一定是word的长度-1;(2)遍历两者,两者应该只有一个字母不同
# 272ms 39.2%
class Solution:
def longestStrChain(self, words: List[str]) -> int:
def sub(word, pre):
pre +=