【力扣roadmap】3093. 最长公共后缀查询

15 阅读1分钟

题目描述

image.png

思路

题目跟你讲后缀,你脚着后缀别扭吗?全转成针对前缀的匹配是不是也一样?

另外,这个题我们先稍微简化一下。

你会发现,wordsContainer的元素之间没有任何关系, wordsQuery之间的查询也都是独立的。但是每一个查询query都和wordsContainer的每一个元素有关。

所以做题流程是,先针对所有的words(将后缀当前缀)建立好trie,然后针对每一个query进行字符匹配即可。当匹配不到新的子节点,那么意味着答案对应着”当前节点“的最短单词在wordsContainer的下标。

所以,我们最好将每个字符对应的”最短单词在wordsContainer的下标“存储在字符对应的节点上,因此Node除了需要维护son属性外,还需要你维护当前字符对应的最小单词长度,当前字符对应的最小单词在wordsContainer的下标。前者用来更新后者,后者用于更新ans。

代码

class Node:
    __slots__ = 'son' , 'min_len' , 'i' 
    def __init__(self) :
        self.son = [None] * 26 
        self.min_len = inf 
        self.i = -1 

class Solution:
    def stringIndices(self, wordsContainer: List[str], wordsQuery: List[str]) -> List[int]:

        base = ord('a') 
        root = Node() 
        for i , word in enumerate(wordsContainer) :
            cur = root
            if cur.min_len > len(word) :  # 刷新根节点
                cur.min_len = len(word)
                cur.i = i 
            for w in map(ord,reversed(word)) : # 将word插入到trie中
                w -= base 
                if not cur.son[w] :
                    cur.son[w] = Node() 
                cur = cur.son[w] 
                if cur.min_len > len(word) :
                    cur.min_len = len(word)
                    cur.i = i

                
        ans = [] 
        for query in wordsQuery :
            cur = root
            for w in map(ord,reversed(query)) :  # query匹配trie的元素
                w -= base 
                if not cur.son[w] :  # 没有新的匹配 结束
                    break 
                cur = cur.son[w] 
            ans.append(cur.i) # 当前最大的前缀匹配对应的下标即为所求
        return ans