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

news/2024/5/20 8:06:20 标签: leetcode, 算法, 职场和发展, 滑动窗口

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

文章目录

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

一、76. 最小覆盖子串

题目链接:https://leetcode.cn/problems/minimum-window-substring/
思路:使用一个needmap记录target中字符的数量,然后用一个windowmap开始收集字符串s中的字符,当条件满足时,就可以开始缩小滑动窗口,并在过程中记录最小子串长度,条件不满足了就退出缩小,继续扩大窗口,以此往复。

class Solution {
     public String minWindow(String s, String t) {
        Map<Character, Integer> window = new HashMap<>();
        Map<Character, Integer> need = new HashMap<>();

        for (char c : t.toCharArray()) {
            need.put(c, need.getOrDefault(c, 0) + 1);
        }
        int left = 0, right = 0, valid = 0, init = 0;
        int min = Integer.MAX_VALUE;
        while (right < s.length()) {
            char rc = s.charAt(right);
            right++;
            if (need.containsKey(rc)) {
                window.put(rc, window.getOrDefault(rc, 0) + 1);
                if (window.get(rc).equals(need.get(rc))) {
                    valid++;
                }
            }
            while (valid == need.size()) {
                if (right - left < min) {
                    min = right - left;
                    init = left;
                }
                char lc = s.charAt(left);
                left++;
                if (need.containsKey(lc)) {
                    if (need.get(lc).equals(window.get(lc))) {
                        valid--;
                    }
                    window.put(lc, window.get(lc)-1);
                }
            }
        }
        return min == Integer.MAX_VALUE ? "" : s.substring(init, init+min);
    }
}

二、567. 字符串的排列

题目链接:https://leetcode.cn/problems/permutation-in-string/
思路:一样是滑动窗口,要求s1的排列是否包含在s2中,其实滑动窗口只要维持和s1的长度相等即可,然后判断这个窗口内元素的个数是否满足。

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

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

题目链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/
思路:也是滑动窗口,这个找异位词和上一题很类似,只不过上一题就一个,这题是有多个然后收集起始位置。

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<>();
        for (char c : p.toCharArray()) {
            need.put(c, need.getOrDefault(c, 0)+1);
        }
        int left = 0, right = 0, valid = 0;
        while (right < s.length()) {
            char rc = s.charAt(right);
            right++;
            if (need.containsKey(rc)) {
                window.put(rc, window.getOrDefault(rc, 0)+1);
                if (window.get(rc).equals(need.get(rc))) {
                    valid++;
                }
            }
            if (right - left == p.length()) {
                if (valid == need.size()) {
                    list.add(left);
                }
                char lc = s.charAt(left);
                left++;
                if (need.containsKey(lc)) {
                    if (window.get(lc).equals(need.get(lc))) {
                        valid--;
                    }
                    window.put(lc, window.get(lc)-1);
                }
            }
        }
        return list;
    }
}

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

题目链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/
思路:求无重复字符的最长子串,扩大窗口时只需要一直往里放即可,如果当前元素添加后数量大于1,就要开始收缩窗口,直到当前元素个数不再大于1,期间窗口每扩大一步就更新一次最大值。

class Solution {
  public int lengthOfLongestSubstring(String s) {
        Map<Character, Integer> window = new HashMap<>();
        int left = 0, right = 0;
        int max = 0;
        while (right < s.length()) {
            char rc = s.charAt(right);
            right++;
            window.put(rc, window.getOrDefault(rc, 0)+1);

            while (window.get(rc) > 1) {
                char lc = s.charAt(left);
                left++;
                window.put(lc, window.get(lc)-1);
            }
            max = Math.max(max, right-left);
        }
        return max;
    }
}

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

相关文章

在线文库系统 转码功能源代码展示 支持文档在线预览查阅功能

1、支持 pdf,doc,docx,ppt,pptx,txt,xlsx,xls,csv,zip,epub,ai,psd 格式的文件 2、文库系统的上传界面&#xff0c;用户可以进行上传自己的文件&#xff0c;然后自定义文档售价&#xff0c;来赚取金额。 3、文库系统的部分代码披露&#xff1a; <template><div clas…

Python 异常处理(try except)

文章目录 1 概述1.1 异常示例 2 异常处理2.1 捕获异常 try except2.2 抛出异常 raise 3 异常类型3.1 内置异常3.2 自定义异常 1 概述 1.1 异常示例 异常&#xff1a;程序执行中出现错误&#xff0c;若不处理&#xff0c;则程序终止 示例代码&#xff1a; v 6 / 0 # 除数不…

1.自动化运维工具Ansible的安装

1.物料准备 四台服务器&#xff0c;其中一个是主控机&#xff0c;三个为host 2.安装 在主控机上安装ansible 2.1 设置EPEL仓库 Ansible仓库默认不在yum仓库中&#xff0c;因此我们需要使用下面的命令启用epel仓库。 yum install epel-release -y2.2 执行安装命令 yum i…

paddlehub无法安装,安装报错【Bug完美解决】

文章目录 项目场景:问题描述:原因分析:PaddleHubBug完美解决方案:其他解决方案另一个类似bug解决方案相关知识学习项目场景: paddlehub无法安装,安装报错【pip、pycharm】【Bug完美解决】 我们正在进行一个基于Python的项目开发,该项目需要集成PaddleHub,以利用其丰富…

PLC:200smart(13-16章)

PLC&#xff1a;200smart 第十三章2、带参子程序3、将子程序设置成库文件 第十三章 项目ValueValue主程序MAIN一个项目只能有一个&#xff0c;循环扫描子程序SBR_0项目中最多有128个&#xff0c;只有在调用时 才执行&#xff08;子程序可以嵌套其他子程序&#xff0c;最多八层…

JVM 之 javac、java、javap 命令详解

目录 一. 前言 二. javac 命令 三. java 命令 四. javap 命令 一. 前言 在日常工作中&#xff0c;我们新建 Java工程&#xff0c;写好代码后&#xff0c;编译和运行几乎都是通过 IDE&#xff08;如idea、eclipse&#xff09;工具完成。但作为 Java开发者还是要了解下 Java虚…

零基础学Python的第五天||字符串(2)

raw_input和print 自从本课程开始以来&#xff0c;我们还没有感受到computer姑娘的智能。最简单的智能应该体现在哪里呢&#xff1f;想想小孩子刚刚回说话的时候情景吧。 小孩学说话&#xff0c;是一个模仿的过程&#xff0c;孩子周围的人怎么说&#xff0c;她&#xff08;他&…

Linux基础操作三:Linux操作命令-目录文件操作

1、关机和重启 关机shutdown -h now 立刻关机shutdown -h 5 5分钟后关机poweroff 立刻关机 重启shutdown -r now 立刻重启shutdown -r 5 5分钟后重启reboot 立刻重启 2、帮助 --help命令shutdown --help&#xff1a;…