首页 > 其他分享 >Minimum Window Substring

Minimum Window Substring

时间:2022-12-10 11:45:56浏览次数:36  
标签:return string ++ res window Substring Window tm Minimum

题目描述

Given two strings s and t of lengths m and n respectively, return the minimum window substring of s such that every character in t (including duplicates) is included in the window. If there is no such substring, return the empty string "".
The testcases will be generated such that the answer is unique.
A substring is a contiguous sequence of characters within the string.

输入描述

输入满足以下条件:

  • m == s.length
  • n == t.length
  • 1 <= m, n <= 105
  • s and t consist of uppercase and lowercase English letters.

示例

输入

s = "ADOBECODEBANC", t = "ABC"

输出

"BANC"

解释

The minimum window substring "BANC" includes 'A', 'B', and 'C' from string t.

分析

显然,可以通过枚举区间的起点和终点暴力解决这个问题,但时间复杂度过高,是否存在一种只需遍历一遍字符串就能得到结果的方法呢?

利用滑动窗口的思想,就可以扫描一遍字符串求解该问题。

本题的滑动窗口解法的伪码如下:

string s, t;
    // 在 s 中寻找 t 的「最小覆盖子串」
    int left = 0, right = 0;
    string res = s;
    
    while(right < s.size()) {
        window.add(s[right]);
        right++;
        // 如果符合要求,说明窗口构造完成,移动 left 缩小窗口
        while (window 符合要求) {
            // 如果这个窗口的子串更短,则更新 res
            res = minLen(res, window);
            window.remove(s[left]);
            left++;
        }
    }
    return res;

目前已经明确了可以通过一遍扫描字符串解决问题,那该如何高效的判断当前窗口是否满足要求就成为了问题的关键。我们可以维护一个字典来实现满足要求的判定。

AC代码


class Solution
{
public:
    string minWindow(string s, string t)
    {
        unordered_map<char, int> tm;
        for (auto i : t)
            tm[i]++;
        int l = 0, r = 0;
        int ansl, len = -1, cnt = 0;
        while (r < s.size())
        {
            if (tm.find(s[r]) != tm.end())
            {
                if (tm[s[r]] > 0)
                    cnt++;
                tm[s[r]]--;
            }
            while (cnt == t.size() && l <= r)
            {
                if (len == -1 || len > r - l + 1)
                {
                    len = r - l + 1;
                    ansl = l;
                }
                if (tm.find(s[l]) != tm.end())
                {
                    if (tm[s[l]] >= 0)
                        cnt--;
                    tm[s[l]]++;
                }
                l++;
            }
            r++;
        }
        return len == -1 ? "" : s.substr(ansl, len);
    }
};

标签:return,string,++,res,window,Substring,Window,tm,Minimum
From: https://www.cnblogs.com/kongaobo/p/16971326.html

相关文章

  • redis for windows 7.0.5安装包全网首发
    这是冰河之刃渡桥计划的一部分,使用Windows计划任务自动运行redis服务。 博客地址:https://www.cnblogs.com/binghe021 下载地址:码云 https://gitee.com/binghe021/r......
  • JavaScript:变量的作用域,window对象,关键字var/let与function
    为什么要将这些内容放在一起,因为他们都跟初始化有关系,我们慢慢说吧。我们在代码中,都会声明变量、函数和对象,然后由浏览器解释器(下面简称浏览器)执行;我们还说过,变量和对象......
  • Linux/Windows双系统时间同步
    Windows和Linux分别用的是RTC和UTC而导致产生8小时的时间差方案1:linux改为RTC时间(systemd默认硬件时钟为协调世界时(UTC))sudotimedatectlset-local-rtc1orsudotimedate......
  • Windows的dism命令
    1.获取帮助dism/get-helpdism/?2.指定当前系统:/online3.列出当前系统的所有功能名称,这些名称可以用在后续的命令中启用或禁止dism/online/get-feature如下图:3.如启用功......
  • Windows,C++编程创建窗口的过程详解
    MFC创建窗口一般要经历以下四个操作步骤:(1)   定义窗口类主要指定窗口类的一些基本且必须指定的特征,窗口类的特征主要是由WNDCLASS结构体来定义的,WNDCLASS的定义如下:type......
  • 关于 SQL window function 的一点使用记录
     上一篇讲了导航函数的使用,这一部分我将记录一下使用windowfunction的例子以供我自己后续查阅搜索。毕竟之前做TP任务比较多,对于AP各种复杂的SQL灵活的使用还有......
  • linux系统访问windows分区不用输密码
    linux和windows双系统用户,用linux的时候访问windows分区是时长发生的事。在ubuntu下,可以安装ntfs-config来实现免输入密码访问windows分区,但是我的archlinux不知道为什么始......
  • Windows下git配置与安装(转载)
    ​Git是Linux的创始人LinusTorvalds在2006年开发的,Linus自嘲说是一个“傻瓜内容跟踪器”。在Windows下使用Git,可以使用Cygwin+Git,也可以使用Msys+Git。Cygwin太庞......
  • ffmpeg库安装及入门指南(Windows篇)- 2022年底钜献
    最近项目需要,使用了ffmpeg做摄像头视频采集和串流。这几天有点时间,打算把相关的一些知识记录分享一下。在撰写本文时,我又在另外一台电脑上把ffmpeg重新安装了一遍,所以......
  • ​​windows上传ipa到开发者中心(app store)的方法
    ​windows上传ipa到开发者中心(appstore)的方法​假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将......