leetcode 76. Minimum Window Substring解析

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". No... 阅读详情

题目是下面
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).

Example:

Input: S = “ADOBECODEBANC”, T = “ABC”
Output: “BANC”

给出字符串S和pattern T,找出包含T中所有字符的最短子字符串。
个人觉得这道题难点主要在各种细节。

思路进化:

待改进思路:
刚开始也是想到2 pointers,left和right。left先不动,right向右走,当left和right中间的字符串包含T中所有字符时,left和right都移向right的下一字符。
至于怎么判断是否包含T中所有字符,先用一个hashSet保存T中所有的char,然后再用一个tmp的hashSet保存,当size一样的时候就得到一个substring,这时再把tmp给clear掉。

改进点1:
这个方法有个问题,hashSet是不能保存重复char的,所以出现重复char的时候,如下例:
S = “a”, T = “aa”
这时塞进hashSet的char是一样的,会判断为是一样

所以需要用一个hashMap,key是T的当前char,Value是这个char出现的次数

改进点2:
left和right不能同时移到right的下一位,例如下面
S = “bbab”, T = “ab”
left = 0, right = 2时满足一个substring,这时left和right同时移到right的下一位,所以left和right都移到最右边的b,所以,最右边的最小字符串“ab”就被跳过去了,所以此方法不可行

解题思路:

根据上述改进点1,因为T中会有重复的字符,所以要记录下它的count,所以这里用一个hashMap,当然还有一种方法是定义一个char类型的数组,size128,包含所有char,然后数组内保存count,效果和hashMap一样,只不过O(1) 访问count。这里的方法用hashMap。

定义一个hashMap<Character, Integer> wordCount保存char和它出现的次数count

	for (int i = 0; i < t.length(); i++) {
            count = wordCount.getOrDefault(t.charAt(i), 0) + 1;
            wordCount.put(t.charAt(i), count);
    }

定义两个pointer,left和right。作一个sliding window。刚开始left和right都指向0,然后right右移。

问题1: 如何判断全部匹配了T中的字符?
当s.charAt(right)的char包含在T中时,取出char对应的count,并把count-1, 当count减到0时,算是匹配了一个字符,可以用一个matchCount变量记录,注意这个match对重复出现的字符也是unique的,当matchCount== wordCount.size()的时候就说明完全匹配了。

			ch = s.charAt(right);
            count = wordCount.get(ch);
            if (count == null) {
                right++;
                continue;
            }
            wordCount.put(ch, count - 1);
            //1 -> 0..
            if (count == 1) {
                matchCount ++;
            }

例如:
S = “ADOBBCODEBANC”, T = “ABC”
这时left指向0,right指向5,substring是“ADOBBC”,长度是6,
这时用minLen变量记录下长度6,起始点index记录下这时的left

这时hashMap的内容是
<A, 0> <B, -1> <C, 0>
因为A出现一次,所以count-1=0
B出现2次,count-2=-1
C出现1次,count-1=0
B出现一次到达0后,出现第二次是仍然需要-1的,因为left右移时要用到。

这时substring已经包含了T中的所有字符,需要做的是缩减substring的长度,以便找到长度更短的substring,right向右移可以保证substring仍然有效,但是长度会变长,所以把left向右边移,以缩短长度。

当left指向的字符在T之内的时候,需要把s.charAt(left)对应的count++(因为前面说了count==0时表示字符匹配,移出去的时候不匹配了count就要+1),同时left++(右移)。
注意count由0变为1时,表示匹配的字符已经不在left和right构成的sliding window里了,matchCount需要-1
left指向的字符不在T之内的时候,直接将left++,所以这里不用if而用while来处理,处理什么,因为substring的length在减小,所以需要更新minLen和index

            while (matchCount == wordCount.size()) {
                if (right - left + 1 < minLen) {
                    minLen = right - left + 1;
                    index = left;
                }
                ch = s.charAt(left);
                count = wordCount.get(ch);
                if (count == null) {
                    left++;
                    continue;
                }
                //0 -> 1..
                if (count == 0) {
                    matchCount--; 
                }
                wordCount.put(ch, count + 1);
                left++;
            }

最后,当minLen没有得到更新,一直是最大值的时候,就说明S中没有包含T的字符串,返回“”

完整代码:

    public String minWindow(String s, String t) {
        if (s == null || t == null) {
			return "";
		}
		if (s.length() == 0 || t.length() == 0 || s.length() < t.length()) {
            return "";
        }
        
        HashMap<Character, Integer> wordCount = new HashMap<>();
        Integer count = 0;
        int minLen = Integer.MAX_VALUE;
        int left = 0;
        int right = 0;
        char ch = 0;
        int matchCount = 0;
        int index = 0;
        
        for (int i = 0; i < t.length(); i++) {
            count = wordCount.getOrDefault(t.charAt(i), 0) + 1;
            wordCount.put(t.charAt(i), count);
        }
        
        while (right < s.length()) {
            ch = s.charAt(right);
            count = wordCount.get(ch);
            if (count == null) {
                right++;
                continue;
            }
            wordCount.put(ch, count - 1);
            //1 -> 0..
            if (count == 1) {
                matchCount ++;
            }
            
            while (matchCount == wordCount.size()) {
                if (right - left + 1 < minLen) {
                    minLen = right - left + 1;
                    index = left;
                }
                ch = s.charAt(left);
                count = wordCount.get(ch);
                if (count == null) {
                    left++;
                    continue;
                }
                //0 -> 1..
                if (count == 0) {
                    matchCount--; 
                }
                wordCount.put(ch, count + 1);
                left++;
            }
            right++;
        }
        return minLen==Integer.MAX_VALUE ? "" : s.substring(index, index + minLen);
    }
【算法】第76题 Minimum Window Substring 1.概述 地址:滑动窗口算法 2.解题 2.1 滑动窗口 解题步骤如下: 假设t元素是 ABC 1.初始化左右指针 2.移动右指针直到窗口中的元素包含了所有的T元素。到C的时候,窗口内的元素包含了ABC三个字符 3.缩小窗口 为什么要缩小呢?因为窗口不是最小的窗口。因此要缩小,尝试移动左指针,然后判断是否还包含,可以看到移动一位 窗口内的元素包含了ABC三个字符 4.缩小窗口 再次缩小粗昂克,然后直到窗口不满足。 5.然后往右边移动窗口。移动一位后发现传媒满足需求 6.然后再次缩小窗口,发现窗 阅读详情

相关推荐

ROS智能车定位导航仿真+功能包自带的地图实现+自己建立的地图实现

ROS智能车定位导航仿真一、前言二、效果图三、准备工作[1.在Ubuntu上安装ROS Kinetic](https://blog.csdn.net/qq_42585108/article/details/104327661)2.创建ROS工作区间①1创建racecar_ws和src文件夹②初始化工作空间③下载racecar源代码包,并编译工程四、启动仿真1.设置环境变量2.启动地图五、建图1.启动slam和rviz2 控制车辆(左侧有个控制窗口),WASD控制前左后右的运动就可以建图了:3.新建终端保存地

qq_42585108的博客 1万+

Minimum Window Substring 最小窗口子串

这道题目的思路跟 找到链接所有单词的子串有些类似,我们容易得到一个时间复杂度为O( n^2 )的解法。 我们用start和end来标记子串的开始和结束,每次从start index = 0开始,找到合法的子字符串。

keke he的专栏 650

ffmpeg 4.4 cenc-aes-ctr 加解密 MP4 工程性质分析

ffmpeg 4.4 cenc-aes-ctr 加解密 MP4 工程性质分析

Dream_Dynasty的博客 3045

76. 最小覆盖子串

上述代码是解决LeetCode上编号为76的题目“Minimum Window Substring(最小覆盖子串)”的一个实现。此问题是要找到字符串S中的最小窗口(子串),使得这个窗口内包含另一个字符串T中的所有字符(包括重复字符)。并不要求子串内字符的顺序与字符串T中的顺序相同。如果S中不存在这样的窗口,则返回空字符串。综上所述,这段代码实现了滑动窗口算法来解决最小覆盖子串问题。这是一个典型的双指针滑动窗口问题,其中实时更新窗口内字符的频次,并不断调整窗口大小寻找最小长度的覆盖子串。

Wzideng@qq.com 1028

光线追踪渲染实战:蒙特卡洛路径追踪及其c++实现

光线追踪超越了传统的图形流水线,是一种现代的渲染。光线追踪是一种基于物理的渲染方法,通过模拟光在介质中的真实表现来输出足以逼近现实的图像。光线从光源出发,经过各种反射折射,进入摄像机。通过渲染方程描述一点的颜色,并且通过蒙特卡洛方法求解渲染方程来获取最终的像素颜色。

AKGWSB 's blog 1万+

Haystack框架实战:从零构建企业级智能问答系统

自然语言处理(NLP)技术通过让计算机理解和生成人类语言,正在深刻改变信息检索与交互方式。其核心原理在于将文本转化为机器可处理的向量表示,并通过语义相似度计算实现精准匹配。这一技术价值在于能够从海量非结构化数据中快速提取精准信息,大幅提升知识获取效率。在工程实践中,检索增强生成(RAG)架构结合了密集向量检索与大语言模型生成能力,成为构建智能问答、知识库助手等应用的主流方案。该架构通过将用户查询与文档库进行语义匹配,并为大语言模型提供精准上下文,有效提升了回答的准确性与可追溯性。本文以Haystack这一生

weixin_42521032的博客 577

Minimum Window Substring

leetcode 经典题Minimum Window Substring ,很巧妙算法。

huruzun的专栏 1682

YOLO26改进策略【多YAML融合】| UNetV2 + BiFormer + WIoU

Wise-IoU是一种基于IoU的损失函数,旨在解决目标检测中边界框回归损失函数在处理低质量训练数据时的问题。

Limiiiing的博客 218

leetcode -- 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”. N...

u014253011的博客 234

基于matlab实现的水果识别系统设计

本项目针对多种常见水果混合的图像,利用 Matlab 软件,对水果的识别进行研究。根据水果和背景的差别选取阈值,对去噪增强对比度后的图像进行二值化处理。再对图像进行边缘检测,选定连通区域,标记后再对不同种水果的颜色,形状,大小等特征进行快速识别水果,从而实现对水果的正确分拣。:水果识别、MATLAB、数字图像处理。

热情、奔放、快乐编程! 4854

浅聊开关电源6:大学生电赛(电源类)之LCL并网滤波器设计(PCB设计,STM32F4xx程序与Simulink仿真)

关于LCL并网滤波器设计的一些小分享

xjtuymh的博客 3651

【LeetCode】 76. Minimum Window Substring 最小覆盖子串(Hard)(JAVA)

【LeetCode】 76. Minimum Window Substring 最小覆盖子串(Hard)(JAVA) 题目地址: https://leetcode.com/problems/minimum-window-substring/ 题目描述: Given a string S and a string T, find the minimum window in S which will ...

qq_16927853的博客 216

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Substring

【LeetCode】 LC第30题,Substring with Concatenation of All words。 题目描述: You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s...

weixin_30549657的博客 144

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

最小覆盖子串例子解释

记录一个题: leetcode: 76. 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). Input: S = “ADOBECODEBANC”, ...

NockinOnHeavensDoor的博客 733

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

双指针之最小覆盖子串

每日一题ing,今天是个hard题76. Minimum Window Substring class Solution { public: string minWindow(string s, string t) { vector <int> num(128,0); vector <bool> flag(128,false); for(int i=0;i<t.length();i++){ fla

Douglas_LT的博客 532

滑动窗口:

滑动窗口: 框架: /* 滑动窗口算法框架 */ void slidingWindow(string s, string t) { //自己创建两个有映射关系的数组 //HashMap<Character,Integer> needs = new HashMap<>(); //HashMap<Character,Integer> windows = new HashMap<>(); //可以选择性讲s和t转换成字符串 //,会

qq_25050779的博客 199

LeetCode 76. Minimum Window Substring 题解

本题是滑动窗口算法的经典难题。使用哈希表或数组统计字符需求双指针维护滑动窗口在满足条件时收缩窗口找最优解注意重复字符的处理。

cannonjinx的博客 4073

LeetCode76——Minimum Window Substring

LeetCode76——Minimum Window Substring 以前似乎做过类似的,点了LeetCode类似题想起来了(这点把不同类型的题目分类真心不错) 好了,跟LeetCode30——Substring with Concatenation of All Words很相似,需要维护一个Map。 当时做这题的时候就感觉自己做得非常不智能,有点像朴素的字符串的模式匹配,效率比较低。

上善若水 4074

【leetcode】76. Minimum Window Substring​​​​​​​

76.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). Example: Input: S = "ADOBECODEBANC", T = "...

lemonade13的博客 130

76. Minimum Window Substring

76. Minimum Window Substring标签(空格分隔): leetcode hard题目 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 = "ADOBE

分享人工智能学习心得与实践经验,探讨应用场景,见证变革与进步 821

LeetCode 76. Minimum Window Substring(滑窗)

题目来源:https://leetcode.com/problems/minimum-window-substring/ 问题描述 76.Minimum Window Substring Hard Given a string S and a string T, find the minimum window in S which will contain all the charact...

da_kao_la的博客 247

LeetCode(76)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

BUILD 3147

leetcode 76 Minimum Window Substring

lc76 Minimum Window Substring haspmap(也可以用数组[26])和双指针 hashmap用来统计target字符串每种字符的个数,以此来检测source子串是否满足条件 双指针, 一个right用来遍历source字符串,也是计算满足条件子串长度时的右侧边界 一个left是左侧边界 每次碰到满足条件的子串,left一直更新,直到left所指元素为targ...

weixin_30249203的博客 146

Leetcode 76 Minimum Window Substring

Leetcode 76 Minimum Window Substring Approach 1: Sliding Window Algorithm: We start with two pointers, left and right initially pointing to the first element of the string S. 双指针,left 和 right。 We ...

weixin_43876597的博客 129
上一篇: Leetcode Majority Element (投票法)
下一篇: leetcode 141.Linked List Cycle(链表环)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值