LeetCode: 792. 匹配子序列的单词数

给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数。

示例:
输入:
S = “abcde”
words = [“a”, “bb”, “acd”, “ace”]
输出: 3
解释: 有三个是 S 的子序列的单词: “a”, “acd”, “ace”。

链接:https://leetcode.com/problems/number-of-matching-subsequences/

解题思路:
桶的思想:建立26个桶,每个桶以一个小写字母命名,将words中的单词按照首字母放入相应的桶中,遍历S,每扫描到一个字母,检查对应的桶中是否有单词,如果有,将该桶中所有单词的第一个字母去除,按照第二个字母重新分配到相应的桶中,待S扫描完后,检查桶中剩余的单词就是未被匹配的单词。

我的代码:

class Solution(object):
    def numMatchingSubseq(self, S, words):
        """
        :type S: str
        :type words: List[str]
        :rtype: int
        """
        
        bucket = [[] for i in range(26)]
        def insert_bucket(word, bucket):
            if word:
                bucket[ord(word[0]) - ord('a')].append(word)
            
        # 初始单词入桶
        for word in words:
            insert_bucket(word, bucket)
            
        # 扫描S,过滤桶中单词
        for s in S:
            l = len(bucket[ord(s) - ord('a')])
            i = 0
            while i < l and bucket[ord(s) - ord('a')]:
                w = bucket[ord(s) - ord('a')].pop(0)[1:]
                insert_bucket(w, bucket)
                i += 1
        # 统计桶中剩余元素
        cur = 0
        for b in bucket:
            cur += len(b)
        return len(words) - cur

Time: O(S.length+∑words[i].length)
Space: O(words.length)
难度:中等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值