【读书笔记:算法小抄】滑动窗口算法——Java版实现

这篇读书笔记介绍了如何使用Java实现滑动窗口算法,包括查找最小覆盖子串、判断字符串排列、找出所有字母异位词以及计算最长无重复子串的方法。通过HashMap的getOrDefault()函数来辅助解决这些问题。
摘要由CSDN通过智能技术生成

算法实现列表

  1. 最小覆盖子串
  2. 字符串排列
  3. 找所有字母异位词
  4. 最长无重复子串

Java基础

  • HashMap中的getOrDefault(key, defaultValue)函数说明:如果map中没有key对应的键值value,则返回默认值defaultValue。

参考代码

  1. 最小覆盖子串
    给你两个字符串S和T,请你在S中找到包含T中全部字母的最短子串。 如果S中没有这样一个子串,则算法返回空串,如果存在这样一个字串,则可以认为答案是唯一的。比如输入S = “ADBECFEBANC”,T = “ABC”,算法应该返回“BANC”。
package com.company;
import static java.lang.System.out;
import java.util.*;

public class Main {
   
    /* 滑动窗口算法 */
    // 1. Leetcode之最小覆盖子串
    // 给你两个字符串S和T,请你在S中找到包含T中全部字母的最短子串。
    // 如果S中没有这样一个子串,则算法返回空串,如果存在这样一个字
    // 串,则可以认为答案是唯一的。
    // 比如输入S = “ADBECFEBANC”,T = “ABC”,算法应该返回“BANC”
    public static String minWindow(String s, String t){
   
        // need为T中字符出现的次数,window表示“窗口”中相应字符的出现次数
        HashMap<Character, Integer> need = new HashMap<>(), window = new HashMap<>();
        for(char c: t.toCharArray()){
   
            need.put(c, need.getOrDefault(c, 0) + 1);
        }

        int left = 0, right = 0;
        // 窗口中满足need条件的字符个数
        int valid = 0;
        // 记录最小覆盖子串的起始索引及长度
        int start = 0, len = Integer.MAX_VALUE;
        while (right < s.length()){
   
            // c为将要移入窗口的字符
            char c = s.charAt(right);
            // 右移窗口
            right++;
            // 进行窗口内数据的一系列更新
            if (need.containsKey(c)){
   
                window.put(c, window.getOrDefault(c, 0) + 1);
                // 如果窗口中某个字符出现的数量满足need中的需要,就更新valid
                if (window.get(c) == need.get(c))
                    valid++;
            }

            // 判断左侧窗口是否需要收缩
            while(valid == need.size()){
   
                // 在这里更新最小覆盖子串
                if (right - left < len){
   
                    start = left;
                    len = right - left;
                }
                // d是将移出窗口的字符
                char d 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值