【python/leetcode/Hard】Substring with Concatenation of All Words

题目

在这里插入图片描述

基本思路

使用一个字典统计一下words中每个单词的数量。由于每个单词的长度一样,以题中给的例子而言,可以3个字母3个字母的检查,如果不在字典中,则break出循环。有一个技巧是建立一个临时字典currDict,用来统计s中那些在words中的单词的数量,必须和words中单词的数量相等,否则同样break。

实现代码

class Solution(object):
    def findSubstring(self, s, words):
        """
        :type s: str
        :type words: List[str]
        :rtype: List[int]
        """
        wordsNum = len(words)
        sLen = len(s)
        
        if wordsNum == 0 or sLen == 0:
            return []
        
        wordLen = len(words[0])
        wordsDict = {}
        for word in words:
            wordsDict[word] = wordsDict[word]+1 if word in wordsDict else 1
        
        res = []
        
        # i 代表起始位置
        for i in range(sLen+1-wordsNum*wordLen):
            curDict = {}
            j = 0
            while j < wordsNum:
                word = s[i+j*wordLen:i+j*wordLen+wordLen]
                
                if word not in wordsDict:
                    break
                
                curDict[word] = curDict[word]+1 if word in curDict else 1
                
                if curDict[word] > wordsDict[word]:
                    break
                j += 1
                
            if j == wordsNum:
                res.append(i)
        
        return res
                
                    
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值