力扣:串联所有单词的子串(滑动窗口+哈希)

news/2024/5/20 7:26:24 标签: leetcode, 哈希算法, 算法, 滑动窗口

首先,用 n \rm n n 表示 S \rm S S 串的长度,用 m \rm m m 表示 w o r d s \rm words words 的长度即words中单词的数量,用 w \rm w w 表示 w o r d s \rm words words 中每个单词的长度。
①对于 S \rm S S 串以 w \rm w w 为长度进行分割,则每一个 w \rm w w 独立存在(可看成一个元素)。
在这里插入图片描述
②则有以 i = 0 , 1 , … , w − 1 i = 0,1,\dots,w-1 i=0,1,,w1 w \rm w w 起点,看作 w \rm w w 个组。
③在该串上,对每一个长度为 w \rm w w 看作独立存在的元素,维护一个长度为 m \rm m m滑动窗口 j \rm j j 作为滑动窗口的结尾,用来维护长度。
在这里插入图片描述
④设 m a p \rm map map 类型的 t o t \rm tot tot ,用来维护 w o r d s words words 里面的单词所对应的数量。
在每一个组中,设 m a p \rm map map 类型的 w d \rm wd wd ,用来维护窗口内每个单词所对应的数量。
c n t \rm cnt cnt 表示两个集合中同时存在的单词的数量
时间复杂度:
对每个视作独立元素做滑动窗口 n w \rm \frac{n}{w} wn滑动窗口移动,每次移动加一个元素,减一个元素,一共有 w \rm w w 组,时间复杂度为 O ( n ) O(n) O(n).

c++:

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> res;
        if(words.empty()) return res;
        int n = s.size(),m = words.size(),w = words[0].size();
        unordered_map<string,int> tot;
        for(auto& word : words) tot[word] ++;

        for(int i = 0;i < w;i++)
        {
            int cnt = 0;
            unordered_map<string,int> wd;
            for(int j = i;j + w <= n;j += w)
            {
                if(j >= i + m * w)//若超出滑动窗口的长度,则将以j结尾的窗口的前一个单词排出
                {
                    auto word = s.substr(j - m * w,w);
                    wd[word]--;
                    //剔除的该单词在滑动窗口集合的数量小于words里面单词的数量,说明匹配的数量减少了
                    if(wd[word] < tot[word]) cnt--;
                }
                auto word = s.substr(j,w);
                wd[word]++;
                //增加的单词在滑动窗口集合的数量增加之后依然没有超过words里单词的数量,说明满足条件的匹配的数量增加了
                if(wd[word] <= tot[word]) cnt++;
                if(cnt == m) res.push_back(j - (m - 1) * w);//当相应单词匹配的数量为m时,即匹配了words里所有的单词,则将滑动窗口起点加入答案。
            }
        }
        return res;
    }
};

http://www.niftyadmin.cn/n/205959.html

相关文章

SpringCloud断路器——Hystrix

Hystrix 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 简介 Hystrix是一个用于处理分布式系统的延迟和容错的一个开源库&#xff0c;在分布式系统里&#xff0c;许多依赖不可避免的会调用失败&#xff0c;比如超时、异常等&#xff0c;Hystrix…

linux驱动开发 - 03_新字符设备驱动

文章目录1 Linux 设备号1.1 设备号的组成1.2 设备号的分配2. 新字符设备驱动原理2.1 分配和释放设备号2.2 新的字符设备注册方法1、字符设备结构2、cdev_init 函数3、cdev_add 函数3、 cdev_del 函数3 自动创建设备节点3.1 mdev 机制3.2 创建和删除类3.3 创建设备3.4 参考示例4…

C++基本语法

C 程序可以定义为对象的集合&#xff0c;这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象&#xff0c;方法、即时变量。 对象 - 对象具有状态和行为。例如&#xff1a;一只狗的状态 - 颜色、名称、品种&#xff0c;行为 - 摇动、叫唤、吃。对象是类…

RGB3DS-RADSDS:为道路检测车配上国产可控、自主研发的核心识别系统

随着我国高速路及各级别公路里程总数的增加&#xff0c;我国公路道路网络已呈四通八达之势&#xff0c;而各段道路的病害与健康程度在其承载功能、地理位置、交通流量等复合因素的影响下展现出各不相同的特征。从道路运维角度&#xff0c;道路检测工作早应全面舍弃人工巡检&…

信息收集之WAF绕过

信息收集之WAF绕过前言一、工具进行目录扫描1. 工具的下载2. 工具的使用二、Python代码进行目录扫描前言 对于web安全无WAF的信息收集&#xff0c;大家可以查看如下链接的文章&#xff1a; web安全之信息收集 对于有WAF信息收集&#xff0c;看如下所示&#xff1a;&#xff08;…

Windows下安装zookeeper,以及相关问题的解决办法

1、下载zookeeper 国内开源镜像下载&#xff1a;Index of /apache/zookeeper 下载后解压到自己想要的位置&#xff0c;zookeeper是免安装的。 2、配置zookeeper 安装好后我们在根目录下创建两个文件夹&#xff0c;一个是data&#xff0c;一个是log&#xff1b; 然后我们打开…

水处理自动化讲义

第一讲 水处理概述 一、水的定义 水是一切生物&#xff08;动物﹑植物﹑人类&#xff09;赖以生存的不可替代的资源。 二、供水行业的特点&#xff1a; 1&#xff0e; 水资源缺乏 (1) 资源性缺水 (2) 水质性缺水 2&#xff0e; 垄断性 3&#xff0e; 服务性 4&#xff…

全链路追踪系统在技术运营层面的应用

随着微服务和分布式架构的引入&#xff0c;各类应用和基础组件形成了网状的分布式调用关系&#xff0c;这种复杂的调用关系就大大增加了问题定位、瓶颈分析、容量评估以及限流降级等稳定性保障工作的难度。正是这样的背景&#xff0c;催生了全链路追踪的解决方案。 这里的一个…