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

算法系列之滑动窗口

算法系列之滑动窗口

题目

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

在这里插入图片描述

解题思路

使用滑动窗口算法
滑动窗口算法的核心思想是在一个给定的序列(如数组或字符串)上定义一个窗口,该窗口可以根据特定的条件进行动态调整。窗口的大小可以固定,也可以根据问题的需求动态变化。在滑动过程中,通过不断更新窗口的边界和内部元素的状态,我们能够高效地获取所需的信息,如最大、最小子序列和,满足特定条件的子序列等。​

想象一个在序列上滑动的窗口,就像一个移动的框,它可以从序列的起始位置开始,每次移动一个单位(或根据具体情况移动多个单位)。在每一步移动中,窗口会 “吸入” 新的元素,同时 “吐出” 离开窗口范围的元素。通过对窗口内元素的实时计算和记录,我们可以在不遍历整个序列的情况下,快速找到满足特定条件的子序列。

  • 算法原理
    • 初始化:设置左右指针left和right,通常都指向数据结构的起始位置。
    • 窗口滑动:
      • 扩展右边界:通常先移动right指针来扩展窗口的右边界,直到窗口内的元素不再满足特定条件或right指针到达数据结构的末尾。
      • 收缩左边界:在窗口不满足条件时,移动left指针来收缩窗口的左边界,直到窗口内的元素重新满足条件。
    • 记录结果:在窗口滑动的过程中,记录下满足条件的中间结果(如最大值、最小值、子串长度等)。
    • 重复步骤:重复步骤2和3,直到right指针遍历完整个数据结构。
获取某个字符串中不重复的字符长度,如abfhdasdrbch
//abfhdasdrbch
        //思路
        // 索引-字符-不重复字符串-重新开始
        //0-a-a  (开始位index=0即a)
        //1-b-ab
        //2-f-abf
        //3-h-abfh
        //4-d-abfhd
        //5-a-bfhda(a重复了,所以需要重新开始,新的开始位,index=1即b)
        //6-s-bfhdas
        //7-d-asd (又重复了,新的开始位,index=5即a)
        //8-r-asdr
        //9-b-asdrb

public static  int getBig(String s){
       

       //最大长度
       int max=0;
       //下一段不重复开始发起始索引号
       int startIndex=0;

       //字符对应最新的索引号
       HashMap<Character, Integer> characterHashMap = new HashMap<Character, Integer>();
       int length = s.length();
       for (int i = 0; i < length; i++) {
       Integer charIndex = characterHashMap.get(s.charAt(i));
       if (charIndex!=null){
       // 如果字符已经存在于哈希表中,并且其位置在窗口内,则移动左边界
       startIndex=Math.max(charIndex+1,startIndex);
       }
       characterHashMap.put(s.charAt(i),i);
       max=Math.max(max,i-startIndex+1);
       }
       return max;
}

相关文章:

  • 2025/3/8 第 27 场 蓝桥入门赛 题解
  • PAT线上考试 真题/注意细节(甲/乙级)
  • 【Go每日一练】返回切片中的最大值和最小值
  • 如何计算两个向量的余弦相似度
  • Linux 内核自定义协议族开发:从 “No buffer space available“ 错误到解决方案
  • Java基础回顾 Day4
  • Sentinel 笔记
  • 【JAVA架构师成长之路】【Redis】第13集:Redis缓存击穿原理、规避、解决方案
  • Hadoop命令行语句
  • Jackson 详解
  • 三、OpenGL中三角形的绘制
  • Web前端开发——HTML基础下
  • µCOS-III从入门到精通 第十章(µC/OS-III消息队列)
  • “国产AI之光”Manus,会成为下一个DeepSeek吗?
  • RHCE9.0版本笔记5:防火墙的本地/远程登录方式
  • linux查看python版本
  • conda 配置新环境时package will be install 和 package will be download 的区别
  • [Lc7_分治-快排] 快速选择排序 | 数组中的第K个最大元素 | 库存管理 III
  • p5.js:模拟 n个彩色小球在一个3D大球体内部弹跳
  • MySQL如何给其他账号分配权限?
  • 黄冈app下载推广介绍/优化排名工具
  • 在百度网站备案查询上显示未备案是什么意思/谷歌海外广告投放
  • 房产门户网站建设/推广app赚佣金平台
  • 给别人做网站挣钱吗/参考消息网国内新闻
  • 软件定制开发费用多少云鲸互创优秀/青岛百度推广优化怎么做的
  • 做盗版网站会坐牢吗/关键词首页排名优化公司推荐