题目描述
思路
题目跟你讲后缀,你脚着后缀别扭吗?全转成针对前缀的匹配是不是也一样?
另外,这个题我们先稍微简化一下。
你会发现,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