【算法】滑动窗口——串联所有单词的子串

今天来以"滑动窗口"的思想来详解一道比较困难的题目------串联所有单词的子串,有需要借鉴即可。

目录

1.题目

题目链接:LINK

这道题如果把每个字符串看成一个字母,就是另外一道中等难度的题目,即,找到字符串中所有字母异位词:LINK

所以说白了,就是把每个字符串来当作一个字母进行处理,当然这仅仅是思想,相比于异位词这个题来说,现在这道比较困难的题目还有以下不同的区别需要注意:

  • ①哈希表不同
  • ②left,right的起始位置,赋值不同
  • ③滑动窗口的执行次数

2.下面是示例代码

cpp 复制代码
class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> ret;

        unordered_map<string,int> hash_w;
        for(int i = 0; i < words.size(); i++)
        {
            string str = words[i];
            hash_w[str]++;
        }

        for(int i = 0; i < words[0].size(); i++)
        {
            unordered_map<string,int> hash_s;
            for(int left = i, right = i,count = 0; right + words[0].size() <= s.size(); right+=words[0].size())
            {
                //进窗口
                string in = s.substr(right,words[0].size());//取子串
                hash_s[in]++;
                if(hash_w.count(in) && hash_s[in] <= hash_w[in])count++;
               //判断
               if(right - left + 1 > words[0].size() * words.size())
               {
                //出窗口
                string out = s.substr(left,words[0].size());
                if(hash_w.count(out) && hash_s[out] <= hash_w[out])count--;//这个地方需要注意要在--之前进行判断
                hash_s[out]--;
                left+=words[0].size();
               }

            //更新结果
            if(count == words.size())ret.push_back(left);
            }
        }

        return ret;
    }
};

3.总结

  • 一、经验

    这道题如果有"找到字符串中所有字母异位词"这道题的经验,说实在的不难,但前提是得有这个思想,没做过"找到字符串中所有字母异位词"这道题直接做这个的比较困难的题目的话会很难受。

  • 二、再就是语法上:

    • ①是对容器的基本语法要有点了解,知道会用一些基本的接口。
    • ②是我上面这个代码其实还做了一点点语法优化
      就是在判断count是否++或者--时候那个条件,即:if(hash_w.count(in) && hash_s[in] <= hash_w[in])count++;如果hash_w[in]不存在他会创建一个in,有点消耗时间

EOF

相关推荐
handler014 分钟前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
zhouwy1139 分钟前
Linux进程与线程编程详解
linux·c++
minglie111 分钟前
实数列的常用递推模式
算法
代码小书生30 分钟前
math,一个基础的 Python 库!
人工智能·python·算法
AI科技星31 分钟前
全域数学·数术本源·高维代数卷(72分册)【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算
生成论实验室38 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第一篇:生成正在发生——从《即事经》到事件-关系网络
人工智能·科技·算法·架构·创业创新
漂流瓶jz42 分钟前
UVA-1152 和为0的4个值 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·二分查找·题解·aoapc·算法竞赛入门经典·uva
leoufung1 小时前
LeetCode 76:Minimum Window Substring 题解与滑动窗口思维详解
算法·leetcode·职场和发展
小O的算法实验室1 小时前
2026年IEEE TETCI,山区环境下基于双种群进化的协同无人机巡逻任务协同优化,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
A7bert7771 小时前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测