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

被折叠的 条评论
为什么被折叠?



