当前位置: 首页 > article >正文

【算法】 滑动窗口—最长无重复子串

        “无重复字符的最长子串”,难度为Medium,看下题目:

        输入一个字符串 s,请计算 s 中不包含重复字符的最长子串长度。

        比如,输入 s = "aabab",算法返回2,因为无重复的最长子串是 "ab" 或者 "ba",长度为2。

        这道题终于有了点新意,不是一套框架就出答案,不过反而更简单了,稍微改一改框架就行了:

package SlidingWindow;

import java.util.HashMap;
import java.util.Map;

// leetcode 016 最长无重复子串
public class LNRS {

    public int lengthOfLongestSubstring(String s) {
        Map<Character, Integer> window = new HashMap<>(); // 记录窗口中的相应字符的出现次数
        int left = 0, right = 0;
        int res = 0; // 记录结果
        while (right < s.length()) {
            // c 是将要移入窗口的字符
            char c = s.charAt(right);
            // 右移窗口
            right++;
            // 进行窗口内数据的一系列更新
            window.put(c, window.getOrDefault(c, 0) + 1);

            /*** debug 输出的位置***/
            System.out.println("window:(" + left + ", " + right + ")");
            /*********************/

            // 判断左侧窗口是否要收缩
            while (window.put(c, window.getOrDefault(c, 0)) > 1) { // window need shrink —窗口需要收缩
                // d 是将要移出窗口的字符
                char d = s.charAt(left);
                // 左移窗口
                left++;
                // 进行窗口内数据的一系列更新
                window.put(d, window.getOrDefault(d, 0) - 1);
            }
            // 在这里更新答案
            res = Math.max(res, right - left);
        }
        return res;
    }

    public static void main(String[] args) {
        LNRS lnrs = new LNRS();
        int res = lnrs.lengthOfLongestSubstring("aabab");
        System.out.println(res);
    }

}

        连 need 和 valid 都不需要,而且更新窗口内数据也只需要简单更新计数器 window 即可。

        当 window[c] 值大于1时,说明窗口中存在重复字符,不符合条件,就该移动 left 缩小窗口了。

        唯一需要注意的是,在哪里更新结果 res 呢?我们要的是最长无重复子串,哪一个阶段可以保证窗口中的字符是没有重复的呢?这里和之前不一样,要在收缩窗口完成后更新 res,因为窗口收缩的 while 条件是存在重复元素,换句话说收缩完成后一定保证窗口中没有重复。


http://www.kler.cn/news/306841.html

相关文章:

  • iPhone手机备忘录转移到Windows电脑上的方法
  • adb devices不显示连接设备怎么解决
  • AI+教育|拥抱AI智能科技,让课堂更生动高效
  • 直播相关03-录制麦克风声音, ffmpeg 命名,使用命令行完成录音
  • 速通汇编(五)认识段地址与偏移地址,CS、IP寄存器和jmp指令,DS寄存器
  • “MIME 媒体类型“用来标识网络传输内容的格式标准
  • [Python办公]常用Python数据采集爬虫技术对比
  • java开发中间件学习记录(持续更新中~)
  • OpenCV_图像旋转超详细讲解
  • 828华为云征文 | 使用Flexus云服务器X实例部署GLPI资产管理系统
  • 计算机网络通关学习(一)
  • jmeter 录制APP脚本
  • 基于R语言结构方程模型分析与实践技术应用
  • SpringCloudAlibaba:Seata
  • 华雁智科前端面试题
  • matlab 单元格数组 和 普通数组
  • Java 流 (Stream) 详解
  • HTTPTomcat
  • QT--connect的使用
  • 【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
  • java坏境搭建
  • python学习——对无人机影像有RGB转换到HSV
  • Java 19 新特性-外部函数与内存 API(Foreign Function Memory API)[Preview]
  • 【Qt绘图】—— 运用Qt进行绘图
  • 【论文阅读】Face2Diffusion for Fast and Editable Face Personalization
  • 【FATFS】FATFS简介及下载
  • 接口与抽象类
  • Spring Boot 集成 MongoDB - 入门指南
  • 【CTF Web】BUUCTF BUU BURP COURSE 1 Writeup(X-Real-IP伪造+POST请求)
  • mysql 8.0 时间维度表生成(可运行)