题目描述
给定一个较长字符串big和一个包含较短字符串的数组smalls,设计一个方法,根据smalls中的每一个较短字符串,对big进行搜索。输出smalls中的字符串在big里出现的所有位置positions,其中positions[i]为smalls[i]出现的所有位置
示例
输入:
big = "mississippi"
smalls = ["is","ppi","hi","sis","i","ssippi"]
输出: [[1,4],[8],[],[3],[1,4,7,10],[5]]
思路
使用前缀树,用smalls构建一颗前缀树,然后在big中遍历,为了减少结尾的讨论,可以加上一个其他非字母
big += "^"
代码
class Trie:
def __init__(self):
self.root = {}
def insert(self, word, num):
cur = self.root
for w in word:
if w not in cur:
cur[w] = {}
cur = cur[w]
cur['#'] = num
class Solution:
def multiSearch(self, big: str, smalls: List[str]) -> List[List[int]]:
trie = Trie()
root = trie.root
for i in range(len(smalls)):
trie.insert(smalls[i],i)
big += '^'
res = [[] for _ in range(len(smalls))]
for i in range(len(big)):
if big[i] in root:
cur = root[big[i]]
for j in range(i+1, len(big)):
if '#' in cur:
res[cur['#']].append(i)
if big[j] in cur:
cur = cur[big[j]]
else:
break
return res
复杂度分析
- 时间复杂度:O(n*m),n:big长度,m:max(smalls[i])
- 空间复杂度:O(m*s),s:公共前缀最多的频率