题目
给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串。
示例:
输入: ["cat","banana","dog","nana","walk","walker","dogwalker"]
输出: "dogwalker"
解释: "dogwalker"可由"dog"和"walker"组成。
分析: 题目要求找到长度最大的单词,且该单词是由单词组中其它单词组成,首先可以对单词组按照长度降序排序,然后从头开始遍历每一个单词,对当前单词进行判断是否由其它单词组成,判断方式可以采用回溯的方法,如果满足条件,则返回当前单词
回溯法判断单词是否是组成单词,i为当前截取位置,word[:i]为存在与单词组中的单词,递归判断word[i:]是否是组成单词,如果不满足,则回溯同时截取位置继续往右遍历,直到word[:i]和word[i:]均是组成单词返回
class Solution:
def longestWord(self, words: List[str]) -> str:
#DFS
def check(word, words):
if word in words:
return True
for i in range(len(word)):
if word[:i+1] in words:
if check(word[i+1:], words):
return True
return False
#set是为了维持单词组原有的顺序
W = sorted(set(words), key=lambda x:len(x), reverse=True)
for i in range(len(W)):
word = W[i]
if check(word, W[:i]+W[i+1:]):
return word
return ""