LeetCode:17.17.多次搜索

给定一个较长字符串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]]
提示:
0 <= len(big) <= 1000
0 <= len(smalls[i]) <= 1000
smalls的总字符数不会超过 100000。
你可以认为smalls中没有重复字符串。
所有出现的字符均为英文小写字母。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multi-search-lcci

class Solution:
    def __init__(self):
        self.Trie = {}              # 构造字典树
    def insert(self, word:str):
        '''建字典树,插入值'''
        p = self.Trie
        for w in word:
            if p.get(w, 0) == 0:
                p[w] = {}
            p = p[w]
        p['*'] = True               # 一个单词结束标志
    def multiSearch(self, big: str, smalls: List[str]) -> List[List[int]]:
        ans = []
        dt = {}                                             # 存储smalls中字符串的位置
        for ind, word in enumerate(smalls):
            '''enumerate(seq),返回下标和数据
               以smalls中的字符串构造字典树
            '''
            ans.append([])                                  # 初始化
            dt[word] = ind
            self.insert(word)
        for i in range(len(big)):
            if big[i] in self.Trie:
                pos = i 
                p = self.Trie
                while pos < len(big) and big[pos] in p:
                    p = p[big[pos]]
                    if p.get('*', False):
                        ans[dt[big[i:pos+1]]].append(i)
                    pos += 1 
        return ans

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值