博客
关于我
LeetCode 76. 最小覆盖子串
阅读量:543 次
发布时间:2019-03-09

本文共 2210 字,大约阅读时间需要 7 分钟。

描述

给你一个字符串 s 和一个字符串 t。任务是从 s 中找出一个最短的子串,使得这个子串包含 t 中的所有字符。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""。

注意

如果 s 中存在这样的子串,我们保证它是唯一的答案。

示例1:

输入:s = "ADOBECODEBANC",t = "ABC"。输出:"BANC"。

示例2:

输入:s = "a",t = "a"。输出:"a"。

进阶问题

你能设计一个在 O(n) 时间内解决此问题的算法吗?

##思路

使用滑动窗口(Sliding Window)技术来解决这个问题,这种技术允许在 O(n) 时间复杂度内完成任务。滑动窗口通过使用两个哈希表 window 和 needs 来追踪当前窗口内的字符及其出现次数,以及 t 中字符的出现次数。

具体步骤如下:

  • 初始化变量 minLen 记录最小长度,左指针 l 和右指针 r,以及哈希表 window 和 needs。
  • 填充 needs 哈希表,将 t 中的每个字符及其出现次数记录下来。
  • 移动右指针,逐步扩展窗口,直到包含 t 中所有字符。
  • 当窗口满足条件时,尝试通过移动左指针缩小窗口,寻找更短的有效子串。
  • 在缩小窗口的过程中,持续检查是否找到了更短的子串,并记录起始位置和长度。
  • 最终,从记录的位置生成并返回最小的子串。
  • 在实现过程中,需要注意:

    • 使用哈希表记录字符出现次数,确保能够快速判断字符是否满足需求。
    • 刚进入窗口时避免频繁遍历,减少额外时间复杂度。
    • 正确处理窗口扩展和收缩过程中的字符出现变化,确保计数准确。
    • 当窗口不满足条件时,及时停止,避免不必要的计算。

    通过以上步骤,可以有效找到满足條件的最短子串,或者判断其不存在并返回空字符串。

    解答代码

    #include 
    #include
    #include
    using namespace std;class Solution {public: string minWindow(string s, string t) { int minLen = INT_MAX; unordered_map
    window; unordered_map
    needs; for (char c : t) { needs[c]++; } int l = 0, r = 0, match = 0, res_start = 0; while (r != s.size()) { char c_right = s[r]; if (needs.count(c_right)) { window[c_right]++; if (window[c_right] == needs[c_right]) { match++; } } r++; while (match == needs.size()) { if (r - l < minLen) { res_start = l; minLen = r - l; } char c_left = s[l]; if (needs.count(c_left)) { window[c_left]--; if (window[c_left] < needs[c_left]) { match--; } } l++; } } return (minLen == INT_MAX) ? "" : s.substr(res_start, minLen); }};

    代码解释

  • 初始化变量:包括 minLen、窗口指针 l 和 r、以及哈希表 window 和 needs。
  • 填充 needs 哈希表:记录 t 中每个字符及其出现次数。
  • 扩展窗口:移动右指针 r,逐步扩展窗口,直到包含 t 中所有字符。
  • 收缩窗口:在满足条件时,尝试通过移动左指针 l 缩小窗口,寻找更短的子串。
  • 记录最小长度:在缩小窗口的过程中,持续检查是否找到了更短的子串,并记录起始位置和长度。
  • 返回结果:根据 minLen 和起始位置生成并返回最小的子串,若未找到则返回空字符串。
  • 通过这种方法,可以在 O(n) 时间复杂度内解决问题,适用于大规模字符串处理。

    转载地址:http://dpusz.baihongyu.com/

    你可能感兴趣的文章
    Python 中多线程与多处理之间的区别
    查看>>
    Python 中如何使用 lambda 函数
    查看>>
    Python 中如何创建多行字符串?
    查看>>
    Python 中如何处理异常?
    查看>>
    Python 中如何实现列表的切片?
    查看>>
    Python 中的装饰器是什么?
    查看>>
    Python 中的装饰器是如何工作的,有哪些实际应用场景?
    查看>>
    python请求html_使用Python请求获取HTML?
    查看>>
    Python 之匿名函数和偏函数
    查看>>
    python 之栈的实现
    查看>>
    python语音播放
    查看>>
    python语言:装饰器原理
    查看>>
    Python 交互式数据可视化详解
    查看>>
    python语言有哪些优点和缺点_Python有哪些优缺点,你了解吗?
    查看>>
    Python 从入门到精通:30天速成教程到底有多狠?你能坚持下来吗?
    查看>>
    Python 从数据库中存储和检索密码的最安全方法
    查看>>
    Python语言及其应用 - 知识点遍历
    查看>>
    Python 优化提速的 8 个小技巧
    查看>>
    Python 余弦相似度与皮尔逊相关系数 计算
    查看>>
    python 使用execjs 报编码错误解决办法,UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xac in position 145: il
    查看>>