Leetcode 3093. Longest Common Suffix Queries

本文介绍了如何使用Trie树数据结构解决LeetCode题目3093,通过构建Trie树并处理顺序关系,实现在给定单词列表中查找最长公共后缀。代码实现显示了如何添加单词到Trie树并查找查询单词的对应索引,时间复杂度和内存使用情况也提供了参考。

1. 解题思路

这一题的话思路上其实就是一个Trie树的变体。

对于每一个wordsQuery当中的word,我们要在wordsContainer当中获取答案,我们只需要将wordsContainer构建成一个Trie树,就能够快速地获得我们所需的答案了。

具体关于Trie树的内容,我们之前已经写过一个博客(经典算法:Trie树结构简介)对其进行过介绍了,这里我们就不赘述了,唯一需要注意的是,这里由于我们不是完全匹配单词,而是匹配最长公共suffix,因此我们需要做一些变体,具体来说就是在trie树的每一个节点都记录下该节点对应的单词。

此外,由于相同suffix的单词需要有一定的顺序关系,因此,我们在加入Trie树时需要对每一个节点的单词进行一下顺序的考察,对此,我们的处理方式是提前进行一下排序即可。

2. 代码实现

给出python代码实现如下:

class Trie:
    def __init__(self):
        self.trie = {}
        self.init = -1
    
    def add_word(self, word, idx):
        trie = self.trie
        if self.init == -1:
            self.init = idx
        for c in word:
            _, trie = trie.setdefault(c, (idx, {}))
        return

    def find(self, word):
        trie = self.trie
        ans = self.init
        for c in word:
            if c not in trie:
                break
            ans, trie = trie[c]
        return ans

class Solution:
    def stringIndices(self, wordsContainer: List[str], wordsQuery: List[str]) -> List[int]:
        words = [(len(w), i, w) for i, w in enumerate(wordsContainer)]
        words = sorted(words)
        
        trie = Trie()
        for _, i, word in words:
            trie.add_word(word[::-1], i)

        ans = [trie.find(word[::-1]) for word in wordsQuery]
        return ans

提交代码评测得到:耗时1197ms,占用内存144.7MB。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值