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

【算法题】无重复字符的最长子串(滑动窗口)

目录

一、题目描述

二、解题思路

1、什么是滑动窗口算法?      

2、滑动窗口一般解题模板

三、参考答案


一、题目描述

       无重复字符的最长子串

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

示例 1:
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是子串的长度,"pwke" 是一个子序列,不是子串。
     
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
 

 注:子串和子序列的区别,子串是从一个原始字符串中直接提取的、在原字符串中连续的一段字符。例如,在字符串"abc"中,"ab"和"bc"都是其子串。相对地,子序列则由原序列中不必须连续的字符组成,只需保持这些字符在原序列中的相对顺序。如在字符串"abc"中,"ac"构成了一个子序列。

二、解题思路

       本题使用滑动窗口方法来解决。

1、什么是滑动窗口算法?      

       滑动窗口算法是一种通过在特定数据结构上移动“窗口”来执行操作的算法。它主要用于优化时间复杂度,特别是在处理数组和字符串相关问题时表现出色。滑动窗口算法的核心在于使用两个指针(左指针和右指针)来标识当前处理的数据范围,并通过移动这两个指针来调整窗口大小,同时根据具体问题的要求更新中间结果。滑动窗口算法的基本思想是通过维护一个窗口,并通过移动该窗口的两个边界(left 和 right 指针)来处理问题。当右边界扩展到符合某种条件或者到达数据结构的末尾时,再通过移动左边界来缩小窗口,并在此过程中更新所需的结果。这种左右指针的移动方式使得算法能够在单次遍历中解决原本需要嵌套循环的问题,从而将时间复杂度从 O(N^2) 降低到 O(N)。

2、滑动窗口一般解题模板
//外层循环扩展右边界,内层循环扩展左边界
for (int l = 0, r = 0 ; r < n ; r++) {//当前考虑的元素while (l <= r && check()) {//区间[left,right]不符合题意//扩展左边界}//区间[left,right]符合题意,统计相关信息
}

三、参考答案

         根据上述解题思路得到的参考代码如下:

class Solution {public int lengthOfLongestSubstring(String s) {//滑动窗口char[] ss = s.toCharArray();Set<Character> set = new HashSet<>();//去重int res = 0;//结果for(int left = 0, right = 0; right < s.length(); right++) {//每一轮右端点都扩一个。char ch = ss[right];//right指向的元素,也是当前要考虑的元素while(set.contains(ch)) {//set中有ch,则缩短左边界,同时从set集合出元素set.remove(ss[left]);left++;}set.add(ss[right]);//别忘。将当前元素加入。res = Math.max(res, right - left + 1);//计算当前不重复子串的长度。}return res;}
}

       时间复杂度分析:由于每个字符最多会被访问两次(起始指针和结束指针各一次),所以时间复杂度为O(n),其中n为字符串的长度。

       空间复杂度分析:O(∣Σ∣),其中 Σ 表示字符集(即字符串中可以出现的字符),∣Σ∣ 表示字符集的大小。在本题中没有明确说明字符集,因此可以默认为所有 ASCII 码在 [0,128) 内的字符,即 ∣Σ∣=128。我们需要用到哈希集合来存储出现过的字符,而字符最多有 ∣Σ∣ 个,因此空间复杂度为 O(∣Σ∣)。

http://www.lryc.cn/news/415769.html

相关文章:

  • Hikari连接池 最大连接数与最小空闲连接数配置多少合适?
  • 【2.4 python中的基本输入和输出】
  • netty长连接集群方案
  • Python面试题:结合Python技术,如何使用Keras进行神经网络建模
  • dll文件丢失怎么恢复?超简单的5个方法,1分钟搞定dll文件修复!
  • [Meachines] [Easy] Sense PFSense防火墙RCE
  • codetop标签双指针题目大全解析(C++解法),双指针刷穿地心!!!
  • Floyd求最短路
  • python爬虫初识
  • Java中类的构造
  • 【C++高阶】深入理解C++异常处理机制:从try到catch的全面解析
  • 【RHEL7】无人值守安装系统
  • [RTOS 学习记录] 预备知识:C语言结构体
  • sqli-labs注入漏洞解析--less-9/10
  • 文心智能体平台:食尚小助,提供美食推荐和烹饪指导
  • 工作中,如何有效解决“冲突”?不回避,不退让才是最佳方式
  • Qt读写配置(ini)文件
  • Python笔试面试题AI答之面向对象(2)
  • Python学习计划——12.1选择一个小项目并完成
  • uniapp 多渠道打包实现方案
  • 请你学习:前端布局3 - 浮动 float
  • PyCharm 2024.1 总结和最新变化
  • RGB红绿灯——Arduino
  • 浅谈用二分和三分法解决问题(c++)
  • Cocos Creator2D游戏开发(9)-飞机大战(7)-爆炸效果
  • 终于有人把华为认证全部说清楚了
  • 【知识】pytorch中的pinned memory和pageable memory
  • 【系统架构设计】数据库系统(五)
  • 如何对人工智能系统进行测试|要点,方法及流程
  • CVE-2023-37569~文件上传【春秋云境靶场渗透】