【leetcode系列】【算法】【简单】词典中最长的单词

题目:

题目链接: https://leetcode-cn.com/problems/longest-word-in-dictionary/

 

解题思路:

方法一:trie + dfs

trie : 前缀树

dfs : 深度优先搜索

将所有的单词插入到trie树中,然后进行深度优先搜索,查找最长的的单词

时间复杂度:O(\sum _{i = 1} ^{N}w_{i}), w_{1} = len(word[0]),其中,w表示的是每个单词的长度

 

方法二:hash + 快排

因为这道题的特殊性:必须是单个字母逐步添加形成另外一个单词

所以可以使用hash表,key为字符串,val为是否是符合要求的字符串。然后对列表进行按照字符串长度的排序之后进行遍历,遍历逻辑如下:

  1. 如果当前字符串长度为1,则插入hash表,key = 当前字符串,val = True
  2. 如果当前字符串长度不为1,则判断当前字符串删除最后一个字符后的字符串,是否在hash表中
    1. 如果存在,则更新之前的字符串val = False,并插入当前新的字符串
    2. 如果不存在,说明之前没有能逐步形成当前字符串的前置字符串,直接跳过
  3. 对hash表进行遍历,查找最长的字符串的长度
  4. 将字符串长度为最长字符串长度的字符串筛选出来,从中选择字典序最靠前的

时间复杂度为:快排的时间复杂度为O(NlogN),遍历的时间复杂度为N,综合起来为O(NlogN)

 

代码实现:

方法一:

class Solution(object):
    def longestWord(self, words):
        Trie = lambda: collections.defaultdict(Trie)
        trie = Trie()
        END = True

        for i, word in enumerate(words):
            reduce(dict.__getitem__, word, trie)[END] = i

        stack = trie.values()
        ans = ""
        while stack:
            cur = stack.pop()
            if END in cur:
                word = words[cur[END]]
                if len(word) > len(ans) or len(word) == len(ans) and word < ans:
                    ans = word
                stack.extend([cur[letter] for letter in cur if letter != END])

        return ans

 

方法二:

class Solution:
    def longestWord(self, words: List[str]) -> str:
        rec = collections.defaultdict(list)
        words.sort(key = lambda item : len(item))
        for idx, a in enumerate(words):
            if len(a) == 1:
                rec[a] = True
            elif a[:-1] in rec:
                rec[a] = True
                rec[a[:-1]] = False

        max_len = max([len(a) for a in rec if rec[a] == True])
        res = [a for a in rec if rec[a] == True and len(a) == max_len]
        res.sort()
        return res[0]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值