题解 | #牛牛的串联子串游戏#滑动窗口

牛牛的串联子串游戏

https://www.nowcoder.com/practice/c1984371372b43f3b10bf6d0231520bb

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param s string字符串 
# @param words string字符串一维数组 
# @return int整型一维数组
from collections import Counter
class Solution:
    def findSubstring(self , s: str, words: List[str]) -> List[int]:
        if not s or not words:
            return []

        word_len = len(words[0])
        word_size = len(words)
        valid = 0
        total_len = word_len * word_size
        left = 0
        need = Counter(words)  # 统计单词列表中每个单词的出现次数
        window = Counter()
        res = []

        for r in range(0, len(s), word_len):

            word = s[r:r + word_len]
            if word in words:
                window[word] += 1
                if window[word] == need[word]:
                    valid += 1

            while r - left + word_len == total_len:
                if valid == word_size:
                    res.append(left)

                if s[left:left + word_len] in need:
                    if window[s[left:left + word_len]] == need[s[left:left + word_len]]:
                        valid -= 1
                    window[s[left:left + word_len]] -= 1

                left += word_len

        return res

定义两个字典need和window,分别用来存放条件和当前遍历到的单词,valid用来判断是否为正确答案

每遍历到一个单词,加入window,并和need比较,若单词在need中,valid++

然后进入循环判断滑动窗口是否要缩小的条件为:r-left+单词长度==words中单词长度和

若valid == words中单词个数,加入正确答案

然后对left对应的单词做判断,在need中,valid--,然后window--

最后left+=单词长度

全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务