面试题 17.15. 最长单词

题目

给定一组单词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 ""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值