leecode3 无重复元素的最长子串

在这里插入图片描述

我的思路

原始代码

我发现我虽然解决问题了,但是我的思路不简洁,不明白。

这个题本质上还是滑动窗口的问题。

具体思路为

  1. 先定义两个指针,对应滑动窗口的两个边界

  2. 关键是:定义一个集合,来判断这个窗口中的元素是否存在重复,如果存在重复的话,就把第一个元素删掉。left右移,缩小窗口

    1. 除了这个点之外,这个题没什么难点
public int lengthOfLongestSubstring(String s) {int len = s.length();if(len<=1){return len;}int low=0,fast=1;int max = 0;List<Character> list = new ArrayList<>();list.add(s.charAt(0));for(;fast<len;fast++){if(list.contains(s.charAt(fast))){list.add(s.charAt(fast));//当前元素重复了,需要移动left左指针。while (true){if(low<fast&&list.get(0)==s.charAt(fast)) {list.remove(0);low++;break;}list.remove(0);low++;}}else {list.add(s.charAt(fast));}if(max<list.size()){max = list.size();}}return max;
}

简化代码

这个题目本身不难,我在想我怎么简化代码,我最初始的代码之所以这么复杂是因为我没有想到判断元素是否存在和移除元素是可以放在一起的。只要list中还存在这个元素,那么就已知移除。而不是逐渐遍历这个集合去不断的寻找这个元素。

注意

如果想要更快的话,可以把这个list换成这个set

public int lengthOfLongestSubstring(String s) {int len = s.length();int max = 0,low=0;List<Character> list = new ArrayList<>();for(int fast=0;fast<len;fast++){char c = s.charAt(fast);while (list.contains(c)){list.remove(0);low++;}list.add(c);max = Math.max(max,fast-low+1);}return max;
}

灵神

灵神的思路我大致看了一下,大体流程和我的相似,区别在于,我是利用list集合进行判断的,灵神使用一个长度为128的数组 进行判断,因为字母ASCII码可以当作这个数组的下标

思路一

class Solution {public int lengthOfLongestSubstring(String S) {char[] s = S.toCharArray(); // 转换成 char[] 加快效率(忽略带来的空间消耗)int n = s.length;int ans = 0;int left = 0;int[] cnt = new int[128]; // 也可以用 HashMap<Character, Integer>,这里为了效率用的数组for (int right = 0; right < n; right++) {char c = s[right];cnt[c]++;while (cnt[c] > 1) { // 窗口内有重复字母cnt[s[left]]--; // 移除窗口左端点字母left++; // 缩小窗口}ans = Math.max(ans, right - left + 1); // 更新窗口长度最大值}return ans;}
}作者:灵茶山艾府
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/solutions/1959540/xia-biao-zong-suan-cuo-qing-kan-zhe-by-e-iaks/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路2

class Solution {public int lengthOfLongestSubstring(String S) {char[] s = S.toCharArray(); // 转换成 char[] 加快效率(忽略带来的空间消耗)int n = s.length;int ans = 0;int left = 0;boolean[] has = new boolean[128]; // 也可以用 HashSet<Character>,这里为了效率用的数组for (int right = 0; right < n; right++) {char c = s[right];// 如果窗口内已经包含 c,那么再加入一个 c 会导致窗口内有重复元素// 所以要在加入 c 之前,先移出窗口内的 cwhile (has[c]) { // 窗口内有 chas[s[left]] = false;left++; // 缩小窗口}has[c] = true; // 加入 cans = Math.max(ans, right - left + 1); // 更新窗口长度最大值}return ans;}
}作者:灵茶山艾府
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/solutions/1959540/xia-biao-zong-suan-cuo-qing-kan-zhe-by-e-iaks/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

【嵌入式汇编基础】-ARM架构基础(三)

ARM架构基础(三) 文章目录 ARM架构基础(三) 7、AArch64 执行状态 7.3 程序计数器 7.4 堆栈指针 7.5 零寄存器 7.6 链接寄存器 7.7 帧指针 7.8 平台寄存器 (x18) 7.9 过程内调用寄存器 7.10 SIMD 和浮点寄存器 7.11 系统寄存器 7.13 PSTATE 7、AArch64 执行状态 7.3 程序计…

[buuctf-misc]喵喵喵

m题目在线评测BUUCTF 是一个 CTF 竞赛和训练平台&#xff0c;为各位 CTF 选手提供真实赛题在线复现等服务。https://buuoj.cn/challenges#%E5%96%B5%E5%96%B5%E5%96%B5BUUCTF 是一个 CTF 竞赛和训练平台&#xff0c;为各位 CTF 选手提供真实赛题在线复现等服务。https://buuoj.…

Vue 详情模块 2

Vue 渐进式JavaScript 框架 基于Vue2的移动端项目&#xff1a;详情基础内容&#xff0c;日期及电影描述 目录 详情 详情基础内容 初始化与赋值 渲染基础内容 详情样式 日期处理 安装moment 定义过滤器 使用过滤器 电影描述 总结 详情 详情基础内容 初始化与赋值 …

【MODIS数据】MYD03

&#x1f30d; 遥感数据的“导航仪”&#xff1a;深入解析MYD03地理定位产品 在卫星遥感领域&#xff0c;精确的地理定位是数据应用的基础。作为Aqua卫星中分辨率成像光谱仪&#xff08;MODIS&#xff09;的核心支撑产品&#xff0c;MYD03虽不如地表温度或植被指数产品知名&am…

如何填写PDF表格的例子

实际应用场景中&#xff0c;我们会遇到需要根据会话内容自动填写表格的情况&#xff0c;比如&#xff1a;pdf 表格。假设根据会话内容已经获得相关信息&#xff0c;下面以填写个人信息为例来说明。个人信息表格.pdf填写后的效果&#xff1a;填写代码如下&#xff1a;from pdfrw…

2023年影响重大的网络安全典型案例

以下是2023年影响重大的网络安全典型案例&#xff0c;按时间顺序梳理事件经过及技术细节&#xff1a;---一、DeFi协议攻击&#xff1a;dForce借贷协议遭入侵&#xff08;2023年4月&#xff09;** - 时间线&#xff1a; - 4月19日08:58&#xff1a;黑客开始攻击Lendf.Me合约&…

Vue 响应式基础全解析2

DOM更新时机 修改响应式状态后,DOM更新不是同步的。Vue会缓冲所有修改,在"next tick"周期中统一更新,确保每个组件只更新一次。 如需在DOM更新后执行代码,可使用nextTick(): import {nextTick } from vueasync function increment() {count.value++

【黑马SpringCloud微服务开发与实战】(九)elasticsearch基础

1. 认识elasticsearch2. 认识和安装ES主播这里之前已经安装好了&#xff0c;资料包里面有镜像 docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugin…

由浅入深地讲清楚浏览器缓存

一、什么是浏览器缓存&#xff1f;&#xff08;入门级&#xff09; 1. 浏览器缓存的定义浏览器缓存就是&#xff1a;浏览器把之前请求过的资源保存起来&#xff0c;下次访问同样的资源时可以直接用本地副本&#xff0c;而不是重新请求服务器。举个生活例子&#xff1a; 你第一次…

Linux I/O 多路复用机制对比分析:poll/ppoll/epoll/select

Linux I/O 多路复用机制对比分析&#xff1a;poll/ppoll/epoll/select 1. 概述 I/O 多路复用是现代高性能网络编程的核心技术&#xff0c;它允许单个线程同时监视多个文件描述符的状态变化&#xff0c;从而实现高效的并发处理。Linux 提供了多种 I/O 多路复用机制&#xff0c…

高防服务器租用:保障数据安全

您的网络速度是否卡顿&#xff0c;业务是否经常受到网络攻击的威胁呢&#xff1f;别担心&#xff0c;高防服务器租用能够帮助你解决这些困扰&#xff01;高防服务器租用拥有着卓越的防御能力&#xff0c;可以帮助企业抵御各种网络攻击&#xff0c;能够轻松化解各种超大流量的网…

基于python多光谱遥感数据处理、图像分类、定量评估及机器学习方法应用

基于卫星或无人机平台的多光谱数据在地质、土壤调查和农业等应用领域发挥了重要作用&#xff0c;在地质应用方面&#xff0c;综合Aster的短波红外波段、landsat热红外波段等多光谱数据&#xff0c;可以通过不同的多光谱数据组合&#xff0c;协同用于矿物信息有效提取。第一&…

CSS content-visibility:提升页面渲染性能的 “智能渲染开关”

在前端开发中&#xff0c;你是否遇到过这样的问题&#xff1a;页面包含大量 DOM 元素&#xff08;如长列表、复杂表格&#xff09;时&#xff0c;滚动变得卡顿&#xff0c;交互响应迟缓&#xff1f;这往往是因为浏览器需要不断渲染屏幕外的元素&#xff0c;浪费了大量计算资源。…

Javascript面试题及详细答案150道之(016-030)

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

仿真电路:(十七下)DC-DC升压压电路原理简单仿真

1.前言 升压的环境用的没降压的多&#xff0c;但是升压会用在LED的很多电路上&#xff0c;所以理解一下原理 2.DC-DC升压原理简单仿真 升压原理 下面还是对升压进行简单的仿真 拓扑结构以及原理和降压还是很相似的&#xff0c;只是位置不太一样&#xff0c;过程推导就不推导…

ros2--source

setup脚本类型 install下面会有几个setup.xxx的shell脚本。 setup.bash setup.ps1 setup.sh setup.zsh 什么区别呢 文件名 Shell 类型 适用场景 setup.bash Bash (Linux/macOS) 标准 Linux/macOS 终端(默认使用) setup.sh 通用 Shell 兼容性更广,但功能可能受限 setu…

40.MySQL事务

1.事务的作用事务用于保证数据的一致性&#xff0c;它由一组相关的 dml (update delete insert) 语句组成&#xff0c;该组的 dml (update delete insert) 语句要么全部成功&#xff0c;要么全部失败。如&#xff1a;转账就要用事务来处理&#xff0c;用以保证数据的一致性。假…

java导入pdf(携带动态表格,图片,纯java不需要模板)

java导出pdf文件一、介绍二、准备三、实现效果四、代码一、介绍 上一篇文章&#xff08;java使用freemarker操作word&#xff08;携带动态表格&#xff0c;图片&#xff09;&#xff09;https://blog.csdn.net/weixin_45853881/article/details/129298494 紧跟上文&#xff0c…

【dropdown组件填坑指南】鼠标从触发元素到下拉框中间间隙时,下拉框消失,怎么解决?

开发dropdown组件填坑之hideDelay 引言 在开发下拉菜单&#xff08;dropdown&#xff09;或弹出框&#xff08;popover&#xff09;组件时&#xff0c;一个常见的用户体验问题就是鼠标移出触发区域后&#xff0c;弹出内容立即消失&#xff0c;这会导致用户无法移动到弹出内容上…

Linux I/O 函数完整清单

Linux I/O 函数完整清单 1. 基础 I/O 函数 1.1 基本读写 #include <unistd.h>ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count);1.2 位置指定读写 #include <unistd.h>ssize_t pread(int fd, void *buf, siz…