滑动窗口(三)

news/2024/5/20 5:54:05 标签: 算法, c++, 滑动窗口

Leetcode30. 串联所有单词的子串

题目

Leetcode30. 串联所有单词的子串

解法(滑动窗口)

利用substr函数截取出来的s中截取出一段一段的单词,然后和words中比较是否相等。

  • hash1<string, int>用来存储words中单词出现的次数
  • left right指针每次移动的步数为wordLen= words[i].size(),也就是单词的长度
  • 边界right + wordLen<= words.size()
  • hash2<string, int>维护窗口内单词出现次数
  • if(hash1.count(in) && hash2[in] <= hash1[in]) count++;
  • if(hash1.count(out) && hash2[out] <= hash1[out]) count--;

代码

class Solution 
{
public:
    vector<int> findSubstring(string s, vector<string>& words) 
    {
        vector<int> res;
        
        unordered_map<string, int> hash1;//保存words里面单词出现的次数
        for(auto i : words) hash1[i]++;

        int wordLen = words[0].size(), n = words.size();
        for(int i = 0; i < wordLen; i++)
        {
            unordered_map<string, int> hash2;//维护窗口中单词出现的次数
            for(int left = i, right = i, count = 0;  right + wordLen <= s.size(); right += wordLen)
            {
                //进窗口 + 维护count
                string in = s.substr(right, wordLen);
                hash2[in]++;
                if(hash1.count(in) && hash2[in] <= hash1[in]) count++;

                if(right - left + 1 > wordLen * n)//判断
                {
                    //出窗口 + 维护count
                    string out = s.substr(left, wordLen);
                    if(hash1.count(out) && hash2[out] <= hash1[out]) count--;
                    hash2[out]--;
                    left += wordLen;
                }
                //更新结果
                if(n == count) res.push_back(left);
            }
        }
        return res;
    }
};

时间复杂度O(N*M)

Leetcode76. 最小覆盖子串

题目

Leetcode76. 最小覆盖子串

解法(滑动窗口)

  • left = 0, right = 0;
  • 进窗口hash2[in]++
  • 判断check(left, right)-> 出窗口hash2[out]--
  • 更新结果(位置每一题都不同,本题在判断后)

利用count来统计有效字符的种类(在check判断的时候,用来优化)
1. 进窗口之前 当hash2[in] == hash1[in] count++;
2. 出窗口之后 当hash2[out] ==hash1[out] count - - ;
3. 判断时 count == hash1.size();

代码

class Solution 
{
public:
    string minWindow(string s, string t) 
    {
        int hash1[128] = {0};//统计t中每个字母出现的次数
        int kinds = 0;//统计有效字母的种类
        for(auto i : t) if(hash1[i]++ == 0) kinds++;
        
        int hash2[128] = {0};//统计窗口内每个字母出现的次数
        int res = INT_MAX;
        int begin = -1;
        for(int left = 0, right = 0, count = 0; right < s.size(); right++)
        {
            char in = s[right];
            if(++hash2[in] == hash1[in]) count++;//进窗口+维护count
            while(count == kinds)//判断
            {
                if(right - left + 1 < res)//更新结果
                {
                    res = right - left + 1;
                    begin = left;
                }
                char out = s[left++];
                if(hash2[out]-- == hash1[out]) count--;//出窗口+维护count
            }
        }
        return begin == -1? "" : s.substr(begin, res);
    }
}; 

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

相关文章

Makefile 中的 clean 目标 Target 到底应该怎么写

如下 .PHONY: clean clean: -rm -f *.o a.out test *.so解释&#xff1a; .PHONY&#xff1a;表示伪目标&#xff0c;即&#xff0c;不需要检查依赖的时间戳&#xff0c;每次运行 make clean 都要执行 clean 目标下的命令 负号(-)&#xff1a;表示当这行命令出错时&#xff…

【AIGC】Stable Diffusion的模型微调

为什么要做模型微调 模型微调可以在现有模型的基础上&#xff0c;让AI懂得如何更精确生成/生成特定的风格、概念、角色、姿势、对象。Stable Diffusion 模型的微调方法通常依赖于您要微调的具体任务和数据。 下面是一个通用的微调过程的概述&#xff1a; 准备数据集&#xf…

Fabric自动化部署使用教程

Fabric自动化部署的使用教程可以按照以下步骤进行&#xff1a; 安装Fabric&#xff1a;首先&#xff0c;确保你的系统中已经安装了Python&#xff0c;然后可以通过pip命令来安装Fabric&#xff0c;执行pip install fabric即可1。创建fabfile.py&#xff1a;在项目根目录下创建…

c入门第十篇——指针入门

一句话来说: 指针就是存储了内存地址值的变量。 在前面讨论传值和传址的时候&#xff0c;我们就已经开始使用了指针来传递地址。 在正式介绍指针之前&#xff0c;我们先来简单了解一下内存。内存可以简单的理解为一排连续的房子的街道&#xff0c;每个房子都有自己的地址&#…

人机协同中的贝叶斯和马尔可夫

人机协同中的马尔可夫链是指在人与机器之间协同工作过程中&#xff0c;可能涉及到的状态转移概率模型。马尔可夫链是一种数学模型&#xff0c;描述了在给定当前状态下&#xff0c;未来状态的概率分布只依赖于当前状态&#xff0c;而与过去状态无关的随机过程。在人机协同工作中…

腾讯云4核8G服务器最大能承载多少用户在线?12M带宽

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线&#xff1f;通用型-4核8G-180G-2000G&#xff0c;2000GB月流量&#xff0c;系统盘为180GB SSD盘&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;假设网站内页平均大小为60KB…

springboot743二手交易平台

springboot743二手交易平台 获取源码——》公主号&#xff1a;计算机专业毕设大全

【C语言】指针的进阶篇,深入理解指针和数组,函数之间的关系

欢迎来CILMY23的博客喔&#xff0c;本期系列为【C语言】指针的进阶篇&#xff0c;深入理解指针和数组&#xff0c;函数之间的关系&#xff0c;图文讲解其他指针类型以及指针和数组&#xff0c;函数之间的关系&#xff0c;带大家更深刻理解指针&#xff0c;以及数组指针&#xf…