LeetCode 76. Minimum Window Substring - Java - 滑动窗口_wowpH的博客-程序员宅基地

技术标签: # LeetCode  字符串  滑动窗口  算法题  

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"

Note:

  • If there is no such window in S that covers all characters in T, return the empty string "".
  • If there is such window, you are guaranteed that there will always be only one unique minimum window in S.

Java代码

/**
 * <p>创建日期:2020-05-23 9:00</p>
 *
 * @author PengHao
 */
class Solution {
    
    public String minWindow(String s, String t) {
    
        char[] sArr = s.toCharArray();

        Map<Character, Integer> window = new HashMap<>(t.length() >> 1);
        Map<Character, Integer> tMap = new HashMap<>(t.length() >> 1);
        // 初始化Map
        for (char ch : t.toCharArray()) {
    
            tMap.put(ch, tMap.getOrDefault(ch, 0) + 1);
        }

        // 滑动窗口中满足条件且不重复的字符个数
        int numOfValidUnrepeatedCharInWindow = 0;
        // 窗口边界,[left, right)
        int left = 0, right = 0;
        // 最小覆盖子串的起始索引和长度
        int minLeft = 0, minLen = s.length() + 1;
        // 扩大窗口
        while (right < s.length()) {
    
            // 进入窗口的字符,并右移窗口右边界
            char enterChar = sArr[right++];
            // 判断字符串t中是否有该字符
            if (tMap.containsKey(enterChar)) {
    
                // 如果有该字符,更新数据
                // 窗口中该字符个数加1
                window.put(enterChar, window.getOrDefault(enterChar, 0) + 1);
                // 判断窗口中该字符的个数是否等于满足条件
                if (window.get(enterChar).equals(tMap.get(enterChar))) {
    
                    // 满足条件,个数加1
                    numOfValidUnrepeatedCharInWindow++;
                }
            }
            // 判断窗口是否满足缩小的条件
            while (numOfValidUnrepeatedCharInWindow == tMap.size()) {
    
                // 判断当前窗口长度是否小于最小长度
                if (minLen > right - left) {
    
                    minLen = right - left;
                    minLeft = left;
                }
                // 移出窗口的字符,并右移窗口左边界
                char outChar = sArr[left++];
                // 判断窗口中是否有该字符
                if (window.containsKey(outChar)) {
    
                    // 判断该字符个数是否刚好满足条件
                    if (window.get(outChar).equals(tMap.get(outChar))) {
    
                        // 不满足条件,个数减1
                        numOfValidUnrepeatedCharInWindow--;
                    }
                    // 字符个数减1
                    window.put(outChar, window.get(outChar) - 1);
                }
            }
        }
        return minLeft + minLen > s.length() ? "" : s.substring(minLeft, minLeft + minLen);
    }
}

参考

  1. 我写了一首诗,把滑动窗口算法变成了默写题 - labuladong
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pfdvnah/article/details/106300205

智能推荐

php findbugs,myeclipse 9.1 安装aptana 3.2 及 FindBugs插件-程序员宅基地

准备工作: aptana下载地址: http://update1.aptana.org/studio/3.2/024747/aptana_update_024747.zip 网页更新地址:http://update1.aptana.org/studio/3.2/024747/index.html 安装方法: 1. 在..\MyEclipse\MyEclipse 9\dropins目录下新建apta..._findbugs 3.02插件安装包

Spring MVC相关web.xml和springmvc-servlet.xml的配置_classpath:springmvc-servlet.xml-程序员宅基地

web.xml如下:<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.._classpath:springmvc-servlet.xml

MyBatis-Plus的自动填充功能_mybatis 批量保存数据 自动填充id-程序员宅基地

一需求项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。可以使用 MyBatis Plus 的自动填充功能,完成这些字段的赋值工作。二 数据库CREATE TABLE `user` ( `id` bigint(20) NOT NULL DEFAULT '0' COMMENT '主键ID', `NAME` varchar(30) DEFAULT NULL COMMENT '姓名', `age` int(11) DEFAULT NULL COMM._mybatis 批量保存数据 自动填充id

nest.js 链接不上数据库 errno 1049_nestjs 配置localhost 作为数据库链接 连接不上-程序员宅基地

nest 链接数据库失败_nestjs 配置localhost 作为数据库链接 连接不上

树莓派3b运行自编译AOSP10_树莓派移植aosp-程序员宅基地

参考如下两篇文章:1.https://blog.csdn.net/stevenqian/article/details/76864832?utm_source=blogxgwz82.https://blog.csdn.net/housezhu/article/details/72229165两篇文章都是基于aosp7.1.2,但https://github.com/android-r..._树莓派移植aosp

驱动蜂鸣器的实验-程序员宅基地

学生实验报告课程名称:单片机原理与应用 专业班级:嵌入式14103班 __姓 名:_赵存档___________学 号:14160310317 2015--2016 学年第 1 学期..._蜂鸣器驱动实验误差原因分析

随便推点

win10找不到本地组策略编辑器解决方法_本组策略编辑器找不到-程序员宅基地

转载自:https://blog.csdn.net/weixin_43356770/article/details/99695422在桌面创建个文本文件,改名gpedit.bat然后把下面这一串复制进去@echo offpushd "%~dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txtdir /b C:\Window_本组策略编辑器找不到

linux nbu客户端配置,NBU Client For Linux 安装_一夜秋风起的博客-程序员宅基地

NB_CLT_7.6.0.4-tar_split.tar[[emailprotected] soft]# tar xvf NB_CLT_7.6.0.4-tar_split.tarNB_update.installVrtsNB_CLT_7.6.0.4.READMEVrtsNB_CLT_7.6.0.4.postinstallVrtsNB_CLT_7.6.0.4.postuninstallVrtsNB..._nbu client

php如何调用mysql中定义的函数_php – 使用Login调用未定义的函数mysql_query()-程序员宅基地

参见英文答案 >Can I mix MySQL APIs in PHP?4个当我执行下面的PHP代码时,我得到致命错误,我不知道如何解决它.谢谢您的帮助错误PHP Fatal error: Uncaught Error: Call to undefined function mysql_query() in /Appli..._php 读取mysql call to undefined function mysql_query()

Hadoop(MR,HDFS,YARN)组件知识点-程序员宅基地

Hadoophadoop2的三大核心:HDFS、MapReduce、YARNhadoop2的四大模块:Hadoop Common 为其他模块提供基础设施Hadoop DFS 一个高可用、高吞吐量的分布式文件系统、Hadoop MapReduce 一个分布式的离线并行计算框架、Hadoop YARN 一个全新的MapReduce框架,任务调度和资源管理。(1)、namenote启动过...

内存空间的分配与回收_回收内存的四种情况-程序员宅基地

内存空间的分配与回收,举个不太恰当的栗子如图书馆的书架,图书怎么存储容易访问,连续编址和非连续编址有什么区别......_回收内存的四种情况

存储过程实现将某一结果集插入到另一张表的俩种方法*_存储过程结果放入新表中-程序员宅基地

存储过程实现将某一结果集插入到另一张表的俩种方法-- 一 ,case 1-- 新增存储过程之前先删除DROP PROCEDURE IF EXISTS tracking;-- 存储过程与其他sql的链接语句DELIMITER $$$$CREATE PROCEDURE `tracking`() -- 定义存储过程名BEGIN -- 开始 -- 需要定义接收游标数据的变量 DECLARE done int DEFAULT 0; -- 定义变量 D_存储过程结果放入新表中