剑指 Offer II 017. 含有所有字符的最短字符串

news/2024/5/20 8:26:16 标签: leetcode, 算法, 滑动窗口

题目链接

剑指 Offer II 017. 含有所有字符的最短字符串 hard

题目描述

给定两个字符串 st。返回 s中包含 t的所有字符的最短子字符串。如果 s中不存在符合条件的子字符串,则返回空字符串 ""

如果 s中存在多个符合条件的子字符串,返回任意一个。

注意: 对于 t中重复字符,我们寻找的子字符串中该字符数量必须不少于 t中该字符数量。

示例 1:

输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”
解释:最短子字符串 “BANC” 包含了字符串 t 的所有字符 ‘A’、‘B’、‘C’

示例 2:

输入:s = “a”, t = “a”
输出:“a”

示例 3:

输入:s = “a”, t = “aa”
输出:“”
解释:t 中两个字符 ‘a’ 均应包含在 s 的子串中,因此没有符合条件的子字符串,返回空字符串。

提示:

  • 1 < = s . l e n g t h , t . l e n g t h < = 1 0 5 1 <= s.length, t.length <= 10^5 1<=s.length,t.length<=105
  • st由英文字母组成

分析:

本题用 滑动窗口 求解。

用哈希表 ht记录 t中字符的出现次数。

再用另一个哈希表 hs记录 s滑动窗口区间的字符出现次数。

用两个指针 ij分别维护滑动窗口的左边界 和 右边界。

如果 hs[s[j]] <= ht[s[j]],说明此时的 s[j]依旧是有效字符,区间有效字符数 cnt += 1

如果 hs[s[i]] > ht[s[i]],说明此时的区间内部字符已经超过了 t,所以收缩左区间,hs[s[i]]--i++

如果 cnt == t.size(),说明此时的区间 [l,r]包含了 t的所有字符,所以此时的 s.substr(i,j-i+1)可作为答案之一。

时间复杂度: O ( n ) O(n) O(n)

代码:

class Solution {
public:
    string minWindow(string s, string t) {
        int m = s.size() , n = t.size();
        if(m < n) return "";

        unordered_map<char,int> ht,hs;

        for(auto &c:t) ht[c]++;

        int len = 1e9,idx = -1;

        int cnt = 0;

        for(int i = 0,j = 0;j < m;j++){
            hs[s[j]]++;
            if(hs[s[j]] <= ht[s[j]]) cnt++;
            
            while(hs[s[i]] > ht[s[i]]){
                hs[s[i]]--;
                i++;
            }

            if(cnt == n){
                if(j - i + 1 < len){
                    idx = i;
                    len = j - i + 1;
                }
            }
        }

        return idx == -1 ? "" : s.substr(idx,len);
    }
};

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

相关文章

SpringBoot入门 - 配置热部署devtools工具

在SpringBoot开发调试中&#xff0c;如果我每行代码的修改都需要重启启动再调试&#xff0c;可能比较费时间&#xff1b;SpringBoot团队针对此问题提供了spring-boot-devtools&#xff08;简称devtools&#xff09;插件&#xff0c;它试图提升开发调试的效率。准备知识点什么是…

A. Linova and Kingdom(dfs + 贪心)

A. Linova and Kingdom&#xff08;dfs 贪心&#xff09;一、问题二、思路三、代码一、问题 二、思路 这道题的大意就是&#xff0c;给我们一棵树&#xff0c;我们需要在树上选择kkk个点&#xff0c;然后让kkk个信使从我们选取的kkk个点向第一个点出发。 我们把我们选取的k个…

Unity之向量计算

文章目录前言向量加法向量减法向量乘法/除法向量点乘&#xff08;内积&#xff09;向量叉乘&#xff08;外积&#xff09;向量归一化向量小结前言 讲讲Unity中的向量有关知识&#xff0c;一些概念在初高中就学过&#xff0c;就不解释了。向量只能与自己相同维度进行计算&#…

Centos 部署Oracle 11g

Centos 部署Oracle 11g部署Oracle 11g准备工作服务器信息oracle安装包服务器准备oracle环境安装Oracle静默方式配置监听以静默方式建立新库及实例部署Oracle 11g 在SpringMVC模式下开发web项目&#xff0c;必然会使用到关系型数据库来存储数据&#xff0c;目前使用比较多的关系…

如何用PHP实现搜索引擎类?

搜索引擎是一种应用程序&#xff0c;用于在互联网上查找和索引信息&#xff0c;并将其呈现给用户以满足其需求。搜索引擎通常会收录互联网上的网页&#xff0c;并为用户提供检索功能&#xff0c;使用户可以通过输入查询词来获得相关的网页。搜索引擎的原理主要包括收录、索引和…

Verdaccio 搭建私有 npm 仓库

背景 公司内部封装业务相关的组件库&#xff0c;工具库&#xff0c;希望统一管理和维护&#xff0c;在多个项目中都能使用&#xff0c;同时希望不公开&#xff0c;只在局域网中使用。所以&#xff0c;需要搭建私有 npm 仓库 Verdaccio verdaccio 是一个能够创建私有 registr…

【微信小程序】-- 案例 - 本地生活(二十)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

Linux基础命令(一)

文章目录1、时间命令&#xff1a;date2、日历命令&#xff1a;cal3、计算器程序&#xff1a;bc4、基础组合键5、正确的关机指令使用5.1 将数据同步写入硬盘中的指令&#xff1a; sync5.2 惯用的关机指令&#xff1a; shutdown5.3 重新开机&#xff0c;关机&#xff1a; reboot,…