算法练习题07:无重复字符的最长子串

news2024/9/21 12:30:29

我们可以使用 滑动窗口 的方法来解决这个问题。这是一种高效的算法,能在 O(n) 的时间复杂度内完成任务。以下是具体的解题思路:

1. 滑动窗口的概念

滑动窗口的想法是使用两个指针(通常称为左指针 i 和右指针 j)来表示一个窗口。这两个指针在字符串上滑动,以找到满足条件的子串。在这个问题中,我们的目标是找到最长的、没有重复字符的子串。

窗口的定义:窗口是由左指针 i 和右指针 j 所包围的子串 s[i:j],它包含 i 到 j-1 的字符。

窗口的移动:右指针 j 用于扩展窗口,左指针 i 用于缩小窗口。

2. 使用数据结构来检测重复字符

为了高效地检测一个字符是否已经在当前窗口中,我们使用一个 HashSet 数据结构。HashSet 允许我们在 O(1) 时间复杂度内判断一个字符是否存在,并且可以在 O(1) 时间内添加或移除字符。

3. 具体步骤
  1. 初始化

    • 定义一个 HashSet 来存储当前窗口内的字符。
    • 初始化两个指针 i 和 j,都指向字符串的开头(即 0)。
    • 初始化一个变量 maxLen 来记录最长无重复子串的长度。
  2. 遍历字符串

    • 使用 j 遍历整个字符串,将每个字符依次尝试添加到 HashSet 中。
    • 如果当前字符 s[j] 不在 HashSet 中:
      • 将其添加到 HashSet 中,表示扩展窗口。
      • 计算当前窗口的长度 j - i + 1,并更新 maxLen
    • 如果当前字符 s[j] 已经存在于 HashSet 中:
      • 说明遇到了重复字符,此时要通过移动左指针 i 来缩小窗口,直到移除重复的字符。
      • 移动左指针的过程中,同时从 HashSet 中移除对应的字符,直到可以将 s[j] 再次安全地添加到 HashSet 中。
  3. 更新结果

    • 每次右指针 j 向右移动时,计算当前窗口的长度,并更新 maxLen,以保证 maxLen 始终保持最长无重复子串的长度。
  4. 返回结果

    • 当右指针 j 遍历完整个字符串后,maxLen 就是最长无重复子串的长度。
class Solution {
    public int lengthOfLongestSubstring(String s) {
        HashSet<Character> set = new HashSet<>();
        int maxLen = 0;
        int i = 0, j = 0;
        int len = s.length();

        while (j < len) {
            if (!set.contains(s.charAt(j))) {
                set.add(s.charAt(j));
                j++;
                maxLen = Math.max(maxLen, j - i);
            } else {
                // 按顺序移除字符
                set.remove(s.charAt(i));
                i++;
            }
        }
        return maxLen;
    }
}

当右指针 j 遇到一个已经存在于 HashSet 中的字符时,我们需要移动左指针 i,从左侧开始逐个移除字符,直到移除重复的那个字符为止。这样可以确保 HashSet 中的字符总是唯一的。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

秋招/春招投递公司记录表格

最近在准备秋招&#xff0c;在各个平台投递秋招简历&#xff0c;什么官网&#xff0c;邮箱&#xff0c;boss&#xff0c;应届生各个平台上&#xff0c;投递的平台比较多&#xff0c;比较乱&#xff0c;因此自己想将这些平台投递记录都收集到一个表格上&#xff0c;所以在腾讯文…

基于Java+MySQL实现在线书店订购系统

一、引言 1.1 编写目的 编写详细设计说明书是软件开发过程必不可少的部分&#xff0c;其目的是为了使开发人员在完成概要设计说明书的基础上完成概要设计规定的各项模块的具体实现的设计工作。同时也是开发人员和最终客户进行需求交流的有效手段。 1.2 背景 开发软件系统名…

数据结构——排序上

1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&a…

多目标应用:基于自组织分群的多目标粒子群优化算法(SS-MOPSO)的移动机器人路径规划研究(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

美国海外仓可以用哪家海外仓系统好?

随着全球贸易的增长&#xff0c;美国已经成为了海外仓储业务的一个重要市场。美国海外仓的数量不断增加&#xff0c;竞争也愈加激烈。为应对这种竞争&#xff0c;并优化仓储和供应链管理&#xff0c;WMS&#xff08;仓库管理系统&#xff09;成为了海外仓的重要工具。 一、WMS…

Wx64ST:一款轻松可修改的C语言Shellcode模板

关于windows_x64_shellcode_template windows_x64_shellcode_template简称为Wx64ST&#xff0c;它是一款功能强大的Shellcode模板&#xff0c;该模板基于C语言编写&#xff0c;其简单、可扩展和易于修改等特性可以帮助广大安全研究人员轻松开发适用于Windows x64的Shellcode。…

kali (linux) 安装配置 共享文件夹 samba

一、samba 安装 sudo apt-get install samba 二、启动samba 服务 systemctl enable nmb systemctl enable smb systemctl start nmb systemctl start smb 三、查看 samba状态 systemctl status nmb systemctl status smb 四、创建共享文件夹 &#xff0c;并修改权限 …

技术指南:5分钟零成本实现本地AI知识库搭建

你一定经历过各种通用大模型一本正经胡说八道的时候吧&#xff0c;AI一通丝滑输出让人真假难辨&#xff0c;防不胜防。这种情况被称为AI幻觉。 大模型产生幻觉不幸“翻车”的原因很大程度上是“先天不足”&#xff0c;例如训练时来自特定领域的训练数据就比较缺失或存在偏差等…

20-22 - 打造专业的编译环境

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 大型项目的编译&#xff08;无第三方库&#xff09;1.1 大型项目的目录结构&#xff08;无第三方库&#xff09;1.2 项目结构设计分析1.3 需要打造的编译环境1.4 解决方案设计 2. 第 1 阶段任务2.1 关键的实现要点2.2 模块 make…

MES管理系统如何提升产品质量与可追溯性

在智能制造的新纪元里&#xff0c;MES管理系统正逐步崭露头角&#xff0c;成为驱动制造业转型升级的幕后英雄。MES管理系统不仅重新定义了生产过程的管理与控制方式&#xff0c;还以数据为驱动&#xff0c;引领着制造业迈向更高效、更智能、更可持续的未来。 智能制造的赋能者&…

U-Mail垃圾邮件过滤网关‍是如何过滤垃圾邮件的?

随着互联网的普及&#xff0c;垃圾邮件已经成为计算机网络安全的又一个公害。因此&#xff0c;反垃圾邮件已经成为互联网应用研究中一个重要课题。为了防止垃圾邮件首先要学会保护自己的邮件地址&#xff0c;避免在网上随意登记和使用邮件地址&#xff0c;预防垃圾邮件骚扰。其…

ALV Tree Control树控件

ALV Tree Control CL_GUI_ALV_TREE 效果&#xff1a; 自定义函数调用&#xff0c;在函数里画屏幕定义树控件显示 FUNCTION ZFI_YSYWLX_HELP_NEW . *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *&qu…

zset使用lua实现取最高分数中的随机成员

zset使用lua实现取最高分数中的随机成员 这种场景适用队列中不想要先入先出、先入后出因为zset的命令都是带有排序功能的&#xff0c;所以取值时要不从大到小要不从小到大所以我使用lua实现随机取成员使用lua是因为可以保持原子性在执行过程中Lua脚本是不会被其他命令或请求打…

C语言典型例题59

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 题目&#xff1a; 例题4.11 译密码。为使电文保密&#xff0c;往往按一定规律将其转换为密码&#xff0c;收报人再按约定的规律将其译回原文。 例如&#xff0c;可以按以下规律将电文变为密码&#xff1a; 将字母A…

我不是非酋之-天空概率

最近入坑了dnf手游&#xff0c;染上了合天空&#xff0c;大黑蛋子一个&#xff0c;突发奇想&#xff0c;模拟下合天空概率&#xff0c;看看是否真的有20%。 梳理代码逻辑如下&#xff1a; 不考虑礼包和其他东西 条件&#xff1a; 合成概率20%&#xff0c;每次需要2个装扮和一个…

格式化的磁盘数据能恢复吗?五个看完即可掌握的恢复方法

磁盘是大多数电子设备都必须具有的一个存储介质&#xff0c;在平时使用的过程中&#xff0c;很多用户为了途一时的方便&#xff0c;经常会需要一键将磁盘里面的数据执行格式化&#xff0c;以实现清空或者删除的情况。然而&#xff0c;在执行完具体的操作后&#xff0c;过了一段…

Vue(十三) 路由、路由嵌套、query、param传参、propos、replace属性。编程式路由导航,特有的生命周期函数,路由守卫

文章目录 路由1. 基本使用2. 多级(嵌套)路由3. 路由query传参4. 命名路由5. 路由param传参6. propos属性7. replace属性8. 编程式路由导航9. 缓存路由组件10. actived&#xff0c;deactived生命周期函数11. 路由守卫1、全局路由2、独享路由3、组件内路由守卫 12. 路由器工作的两…

干货含源码!如何用Java后端操作Docker(命令行篇)

目录 干货含源码&#xff01;如何用Java后端操作Docker&#xff08;命令行篇&#xff09; 一、为什么要用后端程序操作Docker 二、安装Docker 1、安装Docker 2、启动Docker 三、使用Java后端操作docker 1、构建docker镜像并生成容器 2、执行完毕后删除容器和镜像 3、在…

怎么删除谷歌浏览器的下载记录

定期删除谷歌浏览器的下载记录&#xff0c;对于保护个人隐私和提升浏览器性能都非常的重要。为了帮助大家安全的进行谷歌浏览器下载记录的清除&#xff0c;本文为大家分享了实用的操作方法&#xff0c;一起来看看吧。 删除谷歌浏览器下载记录的原因说明 1、保护隐私&#xff1…