这个题解使用了递归的方法来检查一个单词是否可以由其他单词组成。首先,对输入的单词列表进行排序,排序规则是先按照单词长度降序排列,长度相同的情况下按字典序升序排列。这样做的目的是为了先检查最长的单词,以及在长度相同的情况下,优先检查字典序较小的单词。接着,遍历排序后的单词列表,对每个单词使用递归函数来判断它是否可以由列表中其他的单词组成。递归函数的基本思路是:如果当前单词为空,表示已经成功找到了一种组合方式,返回True;否则,遍历单词列表中剩余的单词,检查当前单词是否以列表中的某个单词开头,如果是,则递归地检查去掉开头后剩余部分的单词是否也可以由列表中的单词组成。如果遍历完所有剩余的单词都没有找到合适的组合,则返回False。如果找到了一个可以由其他单词组成的最长单词,就直接返回这个单词,否则返回空字符串。
时间复杂度: O(nlogn + n^2 * m)
空间复杂度: O(m)
class Solution:
def longestWord(self, words: List[str]) -> str:
words.sort(key=lambda x: (-len(x), x)) # 对单词列表按长度降序、字典序升序排序
def recursive(word, array):
if not word: # 递归基准情况:如果当前单词为空,返回True
return True
for x in array:
if word[:len(x)] == x: # 检查当前单词是否以列表中的某个单词开头
if recursive(word[len(x):], array): # 递归检查剩余部分
return True
return False
for i, word in enumerate(words): # 遍历单词列表
if recursive(word, words[i + 1:]): # 检查每个单词是否可以由其他单词组成
return word
return "" # 如果没有符合条件的单词,返回空字符串