【力扣hot100:76. 最小覆盖子串】

题目链接:76. 最小覆盖子串

思路

这道题的目的是找s中最短窗口的子串,这个子串要包含t中的所有字符,这个题可以使用滑动窗口来做。

题的难点在于:如何判断当前s的窗口,是否包含t中所有字符

解决方式 :题目说明了st 由英文字母组成,所以我们可以创建cnt数组统计字符个数,然后可以用枚举的方式来做判断。具体方式见下面的isCovered方法

代码

java 复制代码
class Solution {
  public String minWindow(String S, String t) {
    /**
		 * 找s中包含t的最短窗口
		 * 拆开:1.判断是否包含 2.是否最短
		 */
    //创建统计s跟t的个数的数组
    int [] cntS = new int[128];
    int [] cntT = new int[128];
    //统计t的所有字母以及个数
    for(char c : t.toCharArray()) {
      cntT[c]++;
    }

    char [] s = S.toCharArray();
    int m = s.length;
    //滑动窗口,枚举left	
    int ansLeft = -1;
    int ansRight = m;
    int left = 0;
    for(int right = 0; right < m; right++) {
      cntS[s[right]]++;
      while(isCovered(cntS,cntT)) {
        //查看当前的窗口是否更小
        if(right - left < ansRight - ansLeft) {
          ansRight = right;
          ansLeft = left;

        }
        cntS[s[left]]--;
        left++;
      }

    }
    return ansLeft < 0 ? "" : S.substring(ansLeft,ansRight+1);
  }
  private boolean isCovered(int [] cntS,int [] cntT) {
    for(int c = 'a'; c <= 'z'; c++) {
      if(cntS[c] < cntT[c]) {
        return false;
      }
    }
    for(int c = 'A'; c <= 'Z'; c++) {
      if(cntS[c] < cntT[c]) {
        return false;
      }
    }
    return true;
  }

}

时间复杂度分析

  • 初始化 cntT,遍历符串 t,时间复杂度是O(n)

  • for循环right 循环,执行 m 次,时间复杂度是O(m)

  • while 循环当中,left最多移动 m 次,时间复杂度是O(m)

  • isCovered 方法遍历的是字符集(A-Z, a-z),共 52 次,所以isCovered 方法本身的复杂度是O(1)

  • isCovered 总调用次数最多是2m次,所以总的时间复杂度是O(m)

  • 综上分析总的时间复杂度是O(m+n)

注意

  • 滑动窗口中两个指针各自单向遍历一次
  • 千万不要认为嵌套循环就一定是O(m^2)

如果这篇文章对你有帮助,欢迎点赞、评论、关注、收藏。你们的支持是我前进的动力!

相关推荐
地平线开发者5 小时前
【模型轻量化专题】衡量模型轻量性的指标
算法
学习星球8 小时前
OFDM技术精讲:正交性推导、循环前缀原理与80行Python链路仿真(附实测数据)
算法·面试·前端框架
alphaTao14 小时前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode
Interview Aid11215 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
顶点多余1 天前
那些在算法中适合巩固的知识点---1
java·前端·算法
罗西的思考1 天前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha60161 天前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
多弗朗皮卡丘1 天前
算法详解4:买卖股票的最佳时机系列(上)
算法
维克兜率天1 天前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
AI情绪识别开源1 天前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang