前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >76. 最小覆盖字串

76. 最小覆盖字串

作者头像
用户7447819
发布2021-07-23 14:37:37
4890
发布2021-07-23 14:37:37
举报
文章被收录于专栏:面试指北面试指北面试指北

76. 最小覆盖字串

1. 题目描述

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

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

示例 1:

输入:s = "ADOBECODEBANC", t = "ABC" 输出:"BANC" 示例 2:

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-window-substring

2. 题解

class Solution {
    public String minWindow(String s, String t) {
        int sLength = s.length();
        int tLength = t.length();
        int leftIndex = 0;
        int rightIndex = 0;
        // 滑动窗口的开始位置
        int start = 0; 

        // 统计t中出现的字符及其个数
        HashMap<Character, Integer> windowMap = new HashMap<>();
        HashMap<Character, Integer> tMap = new HashMap<>();
        for(char c:t.toCharArray()) {
            tMap.put(c, tMap.getOrDefault(c, 0) + 1);
        }
        // 最终滑动窗口的长度
        int resultLength = Integer.MAX_VALUE;
        // s覆盖t的长度
        int validLength = 0;

        // 先扩大右边界,用窗口覆盖t,s的字串不需要连续
        // 覆盖的意思是窗口中各个字符的数量等于t中各个字符的数量
        // 收缩左边界,找到最小值
        while(rightIndex < sLength) {
            char c = s.charAt(rightIndex);
            rightIndex++;
            if(tMap.containsKey(c)) {
                windowMap.put(c, windowMap.getOrDefault(c, 0) + 1);
                // 某个字符的数量对上了。
                if(windowMap.get(c).equals(tMap.get(c))) {
                    validLength++;
                }
            }
            // s已经覆盖t,然后进行收缩
            while (validLength == tMap.size()) {
                if (rightIndex - leftIndex < resultLength) {
                    resultLength = rightIndex - leftIndex;
                    start = leftIndex; 
                }
                char cS = s.charAt(leftIndex);
                leftIndex++;
                if (tMap.containsKey(cS)) {
                    if (windowMap.get(cS).equals(tMap.get(cS))) {
                        validLength--;
                    }
                    windowMap.put(cS, windowMap.getOrDefault(cS, 0) - 1);
                }
            }
        }
        if (resultLength == Integer.MAX_VALUE) {
            return "";
        } else {
            return s.substring(start, start + resultLength);
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 面试指北 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 76. 最小覆盖字串
    • 1. 题目描述
      • 2. 题解
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档