面试题 17.17. 多次搜索
大约 2 分钟
---
面试题 17.17. 多次搜索
- 标签:字典树、数组、哈希表、字符串、字符串匹配、滑动窗口
- 难度:中等
题目链接
题目大意
给定一个较长字符串 big 和一个包含较短字符串的数组 smalls。
要求:设计一个方法,根据 smalls 中的每一个较短字符串,对 big 进行搜索。输出 smalls 中的字符串在 big 里出现的所有位置 positions,其中 positions[i] 为 smalls[i] 出现的所有位置。
解题思路
构建字典树,将 smalls 中所有字符串存入字典树中,并在字典树中记录下插入字符串的顺序下标。
然后一重循环遍历 big,表示从第 i 位置开始的字符串 big[i:]。然后在字符串前缀中搜索对应的单词,将所有符合要求的单词插入顺序位置存入列表中,返回列表。
对于列表中每个单词插入下标顺序 index 和 big[i:] 来说, i 就是 smalls 中第 index 个字符串所对应在 big 中的开始位置,将其存入答案数组并返回即可。
代码
class Trie:
def __init__(self):
"""
Initialize your data structure here.
"""
self.children = dict()
self.isEnd = False
self.index = -1
def insert(self, word: str, index: int) -> None:
"""
Inserts a word into the trie.
"""
cur = self
for ch in word:
if ch not in cur.children:
cur.children[ch] = Trie()
cur = cur.children[ch]
cur.isEnd = True
cur.index = index
def search(self, text: str) -> list:
"""
Returns if the word is in the trie.
"""
cur = self
res = []
for i in range(len(text)):
ch = text[i]
if ch not in cur.children:
return res
cur = cur.children[ch]
if cur.isEnd:
res.append(cur.index)
return res
class Solution:
def multiSearch(self, big: str, smalls: List[str]) -> List[List[int]]:
trie_tree = Trie()
for i in range(len(smalls)):
word = smalls[i]
trie_tree.insert(word, i)
res = [[] for _ in range(len(smalls))]
for i in range(len(big)):
for index in trie_tree.search(big[i:]):
res[index].append(i)
return res