力扣labuladong一刷day9滑动窗口共4题

news/2024/5/20 8:26:28 标签: leetcode, 算法, 滑动窗口

力扣labuladong一刷day9滑动窗口共4题

文章目录

      • 力扣labuladong一刷day9滑动窗口共4题
      • 一、76. 最小覆盖子串
      • 二、567. 字符串的排列
      • 三、438. 找到字符串中所有字母异位词
      • 四、3. 无重复字符的最长子串

一、76. 最小覆盖子串

题目链接:https://leetcode.cn/problems/minimum-window-substring/
思路:典型的滑动窗口题目,使用一个map记录所必须的字符个数,使用另外一个map去记录滑动窗口内部的need字符,一旦need所需的个数都满足以后,就开始缩小滑动窗口,在缩小滑动窗口的过程中不断记录最小的窗口长度以及窗口的起始点,并且在map不满足need时结束缩小窗口,继续扩大窗口。

class Solution {
     public String minWindow(String s, String t) {
        Map<Character, Integer> need = new HashMap<>();
        Map<Character, Integer> window = new HashMap<>();
        int left = 0, right = 0, valid = 0;
        int start = 0, max = Integer.MAX_VALUE;
        for (char c : t.toCharArray()) {
            need.put(c, need.getOrDefault(c, 0)+1);
        }
        while (right < s.length()) {
            char c = s.charAt(right);
            right++;
            if (need.containsKey(c)) {
                window.put(c, window.getOrDefault(c, 0)+1);
                if (window.get(c).equals(need.get(c))) {
                    valid++;
                }
            }

            while (valid == need.size()) {
                if (right - left < max) {
                    start = left;
                    max = right-start;
                }
                char cl = s.charAt(left);
                left++;
                if (need.containsKey(cl)) {
                    if (window.get(cl).equals(need.get(cl))) valid--;
                    window.put(cl, window.get(cl)-1);
                    }
                }
            }
            return max == Integer.MAX_VALUE ? "" : s.substring(start, start+max);
        }
}

二、567. 字符串的排列

题目链接:https://leetcode.cn/problems/permutation-in-string/
思路:本题要求s1是s2子串的排列,那就是要求s1与s2的子串长度要相等,那就是我们只需要控制滑动窗口的长度等于子串长度即可,长度相等时只要s1中的字符都出现了即可返回,然后就是正常缩小窗口,再扩大窗口。

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        Map<Character, Integer> need = new HashMap<>();
        Map<Character, Integer> window = new HashMap<>();
        int left = 0, right = 0, valid = 0;
        for (char c : s1.toCharArray()) {
            need.put(c, need.getOrDefault(c, 0) + 1);
        }
        while (right < s2.length()) {
            char c = s2.charAt(right);
            right++;
            if (need.containsKey(c)) {
                window.put(c, window.getOrDefault(c, 0)+1);
                if (window.get(c).equals(need.get(c))) valid++;
            }
            while (right - left == s1.length()) {
                if (valid == need.size()) {
                    return true;
                }
                char cl = s2.charAt(left);
                left++;
                if (need.containsKey(cl)) {
                    if (window.get(cl).equals(need.get(cl))) valid--;
                    window.put(cl, window.get(cl)-1);
                }
            }
        }
        return false;
    }
}

三、438. 找到字符串中所有字母异位词

题目链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/
思路:和上一题基本差不多,也是要求p与s的子串长度相等,我们只需要控制窗口等于p的长度即可,然后在其中判断。

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> list = new ArrayList<>();
        Map<Character, Integer> need = new HashMap<>();
        Map<Character, Integer> window = new HashMap<>();
        int left = 0, right = 0, valid = 0;
        for (char c : p.toCharArray()) {
            need.put(c, need.getOrDefault(c, 0)+1);
        }
        while (right < s.length()) {
            char cr = s.charAt(right);
            right++;
            if (need.containsKey(cr)) {
                window.put(cr, window.getOrDefault(cr, 0)+1);
                if (window.get(cr).equals(need.get(cr))) valid++;
            }
            if (right - left == p.length()) {
                if (valid == need.size()) {
                    list.add(left);
                }
                char cl = s.charAt(left);
                left++;
                if (need.containsKey(cl)) {
                    if (window.get(cl).equals(need.get(cl))) valid--;
                    window.put(cl, window.get(cl)-1);
                }
            }
        }
        return list;
    }
}

四、3. 无重复字符的最长子串

题目链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/
思路:求无重复字符串的最长子串,只需要用map收集字符即可,只要当前字符个数大于1即可开始缩小滑动窗口,直到当前字符的个数不再大于1.
最大长度max的记录放在最后。

class Solution {
  public int lengthOfLongestSubstring(String s) {
        Map<Character, Integer> map = new HashMap<>();
        int left = 0, right = 0, max = 0;
        while (right < s.length()) {
            char c = s.charAt(right);
            right++;
            map.put(c, map.getOrDefault(c, 0)+1);
            while (map.get(c) > 1) {
                char cl = s.charAt(left);
                left++;
                map.put(cl, map.get(cl)-1);
            }
            max = Math.max(max, right - left);
        }
        return max;
    }
}

http://www.niftyadmin.cn/n/5178838.html

相关文章

网购后小心“木马病毒”

双十一刚过&#xff0c;大量消费者通过网络平台购物&#xff0c;其中有不法分子通过大量推送木马病毒获取他人账号密码。 近日&#xff0c;青岛市公安局李沧分局兴华路派出所成功侦破一起盗用网络购物账号&#xff0c;盗刷购物的案件&#xff0c;为受害人追回金额3万余元。 据…

Windows系统Mysql数据库、文件夹自动备份

一、批处理bat文件编写 批处理命令如下&#xff0c;使用时需要将相关参数修改为实际参数 echo off color 0a chcp 65001::数据库备份文件及模型文件备份的根路径 SET BACKUP_DIRZ:\backup ::**************************************配置MySQL数据库备份相关参数*************…

微软允许OEM对Win10不提供关闭Secure Boot

用户可能将无法在Windows 10电脑上安装其它操作系统了&#xff0c;微软不再要求OEM在UEFI 中提供的“关闭 Secure Boot”的选项。 微软最早是在Designed for Windows 8认证时要求OEM的产品必须支持UEFI Secure Boot。Secure Boot 被设计用来防止恶意程序悄悄潜入到引导进程。问…

千兆路由只有200M,原来是模式选择不对,也找到了内网不能通过动态域名访问内部服务的原因

本来1000M的宽带接入的&#xff0c;但是一测试发现只有200M&#xff0c;把电信叼了过来&#xff0c; 一测试发现宽带没问题&#xff0c;网线正常&#xff0c;网卡正常&#xff0c;只有可能是路由器的问题了&#xff0c;尴尬了&#xff0c;赶紧给满意好评放他走。回头好好研究一…

Java版B/S架构云his医院信息管理系统源码(springboot框架)

一、技术框架 ♦ 前端&#xff1a;AngularNginx ♦ 后台&#xff1a;JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;SpringSecurity&#xff0c;MyBatisPlus&#xff0c;等 ♦ 数据库&#xff1a;MySQL MyCat ♦ 缓存&#xff1a;RedisJ2Cache ♦ 消息队…

国科云:浅谈DNS缓存投毒常见类型和防御策略

为了提升解析效率减轻各级服务器的解析压力&#xff0c;DNS系统中引入了缓存机制&#xff0c;但这同样也带来了较大的安全隐患&#xff0c;为攻击者利用DNS缓存进行投毒攻击创造了条件&#xff0c;对DNS系统的安全造成了巨大破坏。本文国科云将分析缓存投毒的两种主要类型&…

JavaScript红宝书第8章:对象、类与面向对象编程(2/4)

JavaScript红宝书第8章&#xff1a;对象、类与面向对象编程&#xff08;2/4&#xff09; 创建对象工厂模式解决工厂模式原理 构造函数模式构造函数模式和工厂模式区别创建Person的new实例中间会发生什么构造函数VS普通函数构造函数问题与解决方案 原型模式理解原型原型层级原型…

STM32F407: CMSIS-DSP库的移植(基于库文件)

目录 1. 源码下载 2. DSP库源码简介 3.基于库的移植(DSP库的使用) 3.1 实验1 3.2 实验2 4. 使用V6版本的编译器进行编译 上一篇&#xff1a;STM32F407-Discovery的硬件FPU-CSDN博客 1. 源码下载 Github地址&#xff1a;GitHub - ARM-software/CMSIS_5: CMSIS Version 5…