力扣真题:无重复字符的最长子串(三种方法)

这道题我一开始使用了Set加类似滑动窗口的方法,最后解得出来,但效率不尽人意,最后经过几次修改,最终用到是滑动窗口+指针+数组的方式讲效果达到最优,超过近99%的代码。

1、第一版

class Solution {public int lengthOfLongestSubstring(String s) {//先判断特殊情况if (s.equals("")){return 0;}//x[i]记录的是以下标为i字符为最后一个字符时不重复字符字串的长度Integer [] x = new Integer[s.length()];char[] chars = s.toCharArray();for (int i = 0; i < s.length(); i++) {int num = 0;//记录以下标为i字符为最后一个字符的字串。HashSet <Character> aa = new HashSet<>();for (int j = i; j >=0; j--) {aa.add(chars[j]);//当子串里有字符被去重了,就说明不能再往下了。if (aa.toArray().length!=++num){num--;break;}}x[i]=num;}int max = Integer.MIN_VALUE;for (int i = 0; i < x.length; i++) {if (max<x[i]){max = x[i];}}return max;}
}

2、第二版

使用了普通的滑动窗口的思路。

class Solution {public int lengthOfLongestSubstring(String s) {//维护者left和right指针中存在的字符HashSet<Character> hashSet = new HashSet<>();int left = 0;int right = 0;int max = 0;//最长长度while(right<s.length()){//如果此时right指向的字符已经在left和right指针中间了//就将left向右移,直至此时right指向的字符不存在于hashSet当中了if (hashSet.contains(s.charAt(right))){hashSet.remove(s.charAt(left++));//如果不存在于hashSet当中就继续right又移,并将其添加到集合当中//更新max;}else {hashSet.add(s.charAt(right++));max = Math.max(max,right-left);}}return max;}
}

3、第三版

此时不需要维护那个set字串了,直接维护一个数组,记录这上一次这个字符出现的下标,如果出现重复字符,直接将left跳转到这个上一次出现字符的后一个,直接一步到位,不需要其一步步向右移动了。

class Solution {public int lengthOfLongestSubstring(String s) {//维护一个数组,记录这上一次这个字符出现的下标int[] last = new int[128];for(int i = 0; i < 128; i++) {last[i] = -1;}int n = s.length();int max = 0;int left = 0;for(int i = 0; i < n; i++) {int index = s.charAt(i);//直接跳转到上次的出现的下标left = Math.max(left, last[index] + 1);max   = Math.max(max, i - left + 1);//更新最新出现的字符的下标last[index] = i;}return max;}
}

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

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

相关文章

TCP连接分析:探寻TCP的三次握手

文章目录 一、实验背景与目的二、实验需求三、实验解法1. 预先抓包监测使用Wireshark工具2.进行TCP三次握手&#xff0c;访问www.baidu.com3.分析Wireshark捕获的TCP包 摘要&#xff1a; 本实验使用Wireshark工具&#xff0c;通过抓包监测和分析&#xff0c;深入研究了与百度服…

代码随想录笔记--链表篇

目录 1--虚拟头节点的使用 2--设计链表 3--反转链表 4--两两交换链表中的节点 5--快慢指针 5-1--删除链表倒数第N个节点 5-2--环形链表 5-3--环形链表II 1--虚拟头节点的使用 在链表相关题目中&#xff0c;常新定义一个虚拟头结点 dummynode 来指向原链表的头结点&…

mysql索引、事务、存储引擎

一、索引 索引的概念&#xff1a; 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过指针指向数据记录的内存地址&#xff09;。使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是…

python的sort与sorted

一、sort 方法 sort 方法是列表的方法&#xff0c;用于在原地对列表进行排序&#xff0c;即直接修改原始列表&#xff0c;不返回新的列表。 它可以接受两个可选参数&#xff1a;key 和 reverse。 key 是一个函数&#xff0c;用于指定排序的依据&#xff1b; reverse 是一…

XSS检测工具XSStrike源码分析及使用记录

目录 ​编辑 官方说明 主要特点 参数 源码刨析 扫描模式 自带payload扫描

npm install 报错

npm install 报错 npm install 报错 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: yudao-ui-admin1.8.0-snapshot npm ERR! Found: eslint7.15.0 npm ERR! node_modules/eslint npm ERR! dev eslint&q…

Greenplum实用技巧

一、通过gp_segment_id查看数据倾斜 gp_segment_id是表中的隐藏列&#xff0c;用来标记该行属于哪个segment节点。因此可以基于该隐藏列进行分组查询&#xff0c;获取每个segment的记录数&#xff0c;从而判断表数据的分布是否均匀或有倾斜。 qb#select gp_segment_id, count…

【js】Map遍历方法

Map 结构原生提供三个遍历器生成函数和一个遍历方法。 Map.prototype.keys()&#xff1a;返回键名的遍历器。Map.prototype.values()&#xff1a;返回键值的遍历器。Map.prototype.entries()&#xff1a;返回所有成员的遍历器。Map.prototype.forEach()&#xff1a;遍历 Map 的…

文本编辑器Vim常用操作和技巧

文章目录 1. Vim常用操作1.1 Vim简介1.2 Vim工作模式1.3 插入命令1.4 定位命令1.5 删除命令1.6 复制和剪切命令1.7 替换和取消命令1.8 搜索和搜索替换命令1.9 保存和退出命令 2. Vim使用技巧 1. Vim常用操作 1.1 Vim简介 Vim是一个功能强大的全屏幕文本编辑器&#xff0c;是L…

谷歌发布Gemini以5倍速击败GPT-4

在Covid疫情爆发之前&#xff0c;谷歌发布了MEENA模型&#xff0c;短时间内成为世界上最好的大型语言模型。谷歌发布的博客和论文非常可爱&#xff0c;因为它特别与OpenAI进行了比较。 相比于现有的最先进生成模型OpenAI GPT-2&#xff0c;MEENA的模型容量增加了1.7倍&#xf…

Java 数据结构使用学习

Set和List的区别 Set 接口实例存储的是无序的&#xff0c;不重复的数据。List 接口实例存储的是有序的&#xff0c;可以重复的元素。 Set 检索效率低下&#xff0c;删除和插入效率高&#xff0c;插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。 List 和数…

【LeetCode算法系列题解】第6~10题

CONTENTS LeetCode 6. N 字形变换&#xff08;中等&#xff09;LeetCode 7. 整数反转&#xff08;中等&#xff09;LeetCode 8. 字符串转换整数-atoi&#xff08;中等&#xff09;LeetCode 9. 回文数&#xff08;简单&#xff09;LeetCode 10. 正则表达式匹配&#xff08;困难&…

C# Linq源码分析之Take(四)

概要 本文主要对Take的优化方法进行源码分析&#xff0c;分析Take在配合Select&#xff0c;Where等常用的Linq扩展方法使用时候&#xff0c;如何实现优化处理。 本文涉及到Select, Where和Take和三个方法的源码分析&#xff0c;其中Select, Where, Take更详尽的源码分析&…

【日积月累】后端刷题日志

刷题日志 说说对Java的理解JAVA中抽象类和接口之间的区别Java中的泛型 和equals()的区别八种基本数据类型与他们的包装类在一个静态方法内调用一个非静态成员为什么是非法的静态方法与实例方法有何不同重载与重写深拷贝浅拷贝面向过程与面向对象成员变量与局部变量Spring框架Sp…

Spring Bean对象生命周期

文章目录 前言基础通俗理解bean作用域 前言 最近学习spring的一些基础概念&#xff0c;所以就先了解了bean对象的概念&#xff0c;而且发现这个里面涉及到很多的内容&#xff0c;比如在spring中一个bean对象是如何创建以及销毁的这些概念&#xff0c;所以就打算总结一些spring…

微信开发之一键踢出群聊的技术实现

简要描述&#xff1a; 删除群成员 请求URL&#xff1a; http://域名地址/deleteChatRoomMember 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选…

SpringBoot之logback-spring.xml详细配置

《logback官网》 各种指导文件&#xff0c;有空自己去看&#xff0c;比如&#xff1a;我们需要调整的是布局&#xff0c;直接看Layouts。 pom.xml <!-- 环境配置 --><profiles><profile><id>dev</id><properties><spring.profiles.a…

基于java swing和mysql实现的汽车租赁管理系统(源码+数据库+文档+运行指导视频)

一、项目简介 本项目是一套基于java swing和mysql实现的汽车租赁管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经…

面试题整理

数据结构与算法 快排 实现原理&#xff1f; 不快原地算法---什么意思&#xff1f; 快排的时间复杂度&#xff1f; 有序数组快排的时间复杂度和解决办法&#xff1f; 快排查找第K个最大元素&#xff1f; &#xff08;target_indexnum.size-k&#xff09; 归并 实现原理&…

麒麟系统上安装 MySQL 8.0.24

我介绍一下在麒麟系统上安装 MySQL 8.0.24 的详细步骤&#xff0c;前提是您已经下载了 mysql-8.0.24-linux-glibc2.12-x86_64.tar.xz 安装包。其实安装很简单&#xff0c;但是有坑&#xff0c;而且问题非常严重&#xff01;由于麒麟系统相关文章博客较少&#xff0c;导致遇到了…