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

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

思路

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

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

解决方式 :题目说明了s 和 t 由英文字母组成,所以我们可以创建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)

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

相关推荐
其实防守也摸鱼3 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
Nuanyt4 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
w_zero_one7 小时前
递归算法(一)
java·开发语言·算法
圣保罗的大教堂7 小时前
leetcode 3736. 最小操作次数使数组元素相等 III 简单
leetcode
文丑颜不良啊8 小时前
LeetCode1881~1990题目解析
java·leetcode
风影同志783248 小时前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG9 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
lsc_blog9 小时前
年底还在招的岗位,先确认缺口和到岗要求
git·缓存·ci/cd·职场和发展·github
地平线开发者9 小时前
CLIP 的零样本分类:一组文本如何变成图像分类器?
算法