当前位置: 首页 > news >正文

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

题目链接

剑指 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.length,t.length<=1051 <= s.length, t.length <= 10^51<=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.lryc.cn/news/28320.html

相关文章:

  • Modbus协议初探(C#实现)
  • 【华为OD机试2023】静态扫描 C++ Java Python
  • 函数栈帧的创建和销毁(详解)
  • 【100个 Unity实用技能】 | 脚本无需挂载到游戏对象上也可执行的方法
  • 条件期望5
  • RecyclerView ViewType二级
  • 将对象或数组存在 dom元素的属性上,最后取不到完整数据,只取到 [{
  • Flask源码篇:Flask路由规则与请求匹配过程(超详细,易懂)
  • Jmeter接口测试教程之【参数化技巧总结】,总有一个是你不知道的
  • 缓存与数据库的双写一致性
  • 力扣-213打家劫舍II(dp)
  • 关于【网格结构】岛屿类问题的通用解法DFS(深度遍历)遍历框架+回溯+剪枝总结
  • 【LeetCode】982. 按位与为零的三元组
  • Linux内核源码进程原理分析
  • 电子技术——CMOS反相器
  • gazebo仿真轨迹规划+跟踪(不在move_base框架下)
  • C. Good Subarrays(前缀和)
  • 关于Facebook Messenger CRM,这里有你想要知道的一切
  • ChIP-seq 分析:数据与Peak 基因注释(10)
  • 《C++ Primer Plus》第18章:探讨 C++ 新标准(8)
  • YOLO-V5 系列算法和代码解析(八)—— 模型移植
  • js实现复制拷贝的兼容方法
  • 学习 Python 之 Pygame 开发魂斗罗(八)
  • Lesson11---分类问题
  • Python基础学习12——异常
  • [日常练习]练习17:链表头插法、尾插法练习
  • 第十四届蓝桥杯模拟赛(第三期)试题与题解 C++
  • 关于 “宏“
  • 1.2 CSS标签选择器,类选择器
  • 【Linux】进程等待 | 详解 wait/waitpid 的 status 参数