LeetCode76 Minimum Window Substring

本文介绍了解决LeetCode 76题——最小窗口子串的方法。通过维护一个动态窗口并使用左右游标伸缩移动,实现O(n)复杂度下寻找包含目标字符串所有字符的最小子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode76 Minimum Window Substring

问题描述

Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

For example,
S = “ADOBECODEBANC”
T = “ABC”
Minimum window is “BANC”.

Note:
If there is no such window in S that covers all characters in T, return the empty string “”.

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.

问题分析

这道题题目的含义就给出了一些解题的思路,如何获取这个窗?可以考虑维护一个动态的窗,从左到右遍历字符串S,最后返回最小的结果。

那么这个窗应该怎么操作呢,首先能够想到这个窗户的长度是可以变化的,但是必须大于或等于T字符串的长度。

这个窗户的变化可以利用左右游标的变化来进行伸缩和移动,首先移动右游标。

如果窗户的宽度符合T字符串的要求,那么进行判断,

如果不满足,那么继续移动右游标,

如果满足条件,那么记录当前大小,然后移动左游标。

然后再一次进行判断,决定移动左游标还是右游标,最后右游标移动到最后。完成遍历。

代码如下

public String minWindow(String s, String t) {
    if(s==null||s.length()<1){
        return "";
    }
    Map<Character,Integer> tMap = new HashMap<>();
    //将t字符串中的字符保存到Map中
    for (int i = 0; i < t.length() ; i++) {
        if(tMap.containsKey(t.charAt(i))){
            //如果已存在,累加
            tMap.put(t.charAt(i),tMap.get(t.charAt(i))+1);
        }else {
            //如果不存在,添加
            tMap.put(t.charAt(i),1);
        #  }
    }

    int left = 0;//最小字符串对应t字符串的左边位置
    int right = s.length();//最小字符串对应s字符串的右边位置
    int count =0; //当前窗口的大小
    for(int r=0,l=0;r<s.length();r++){
        if(tMap.containsKey(s.charAt(r))){
            tMap.put(s.charAt(r),tMap.get(s.charAt(r))-1);
            if(tMap.get(s.charAt(r))>=0){
                count++;
            }
            while(count==t.length()){
                //if size of window == s.length()
                if(r-l<=right-left){
                    left=l;
                    right=r;
                }
                if(tMap.containsKey(s.charAt(l))){
                    tMap.put(s.charAt(l),tMap.get(s.charAt(l))+1);
                    if(tMap.get(s.charAt(l))>0){
                        count--;
                    }
                }
                l++;
            }
        }

    }
    if(right-left+1>s.length()){
        return "";
    }
    return s.substring(left,right+1);
}

LeetCode学习笔记持续更新

GitHub地址 https://github.com/yanqinghe/leetcode

优快云博客地址 http://blog.youkuaiyun.com/yanqinghe123/article/category/7176678

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值