LeetCode 取经之路——第三题-无重复长度的最长子串

🎉🎉🎉今天给大家分享的是一道滑动窗口的OJ题。

3.无重复长度的最长子串 

😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!

动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛

目录

一、题目解析 

二、源代码 


 

一、题目解析 

这个题目的意思就是: 在给定的字符串里面,找出不重复的字符串的最大长度。

首先想到的肯定是暴力枚举了,即枚举出所有不重复的字符串,然后找出其中长度最大的。这个还是比较容易想到的。如下图所示:从字符串首元素开始枚举,不重复就一直遍历,直到发现有重复元素为止。但是我们看图是肯定知道有重复,但是代码要怎么写呢?这里就需要用到数据结构中的哈希表了,我的思路是:遍历到一个字符就把它放到哈希表里面,然后再取判断当前这个字符的个数是否大于1,如果大于那就保存当前的字符串长度,继续枚举下一个字符。

其次,不知道大家看了上图后,会不会很容易的想到 "滑动窗口" 。上面的解法,时间复杂度是O(N^2),相对来说还是比较高的,我们可以用 "滑动窗口"的思想来解决问题:

同样也是需要用到哈希表,但是这里我们把字符串转成字符数组后,通过字符ASCII码值也可以判断当前字符个数,因为相同的字符ASCII码值肯定相同,所以在"哈希数组"里存储的位置也肯定是一样的。因此不必使用真正的 "哈希表"。大致思路如下:

  • 定义两个指针 left 和 right,初始时都从 0 开始。
  • right 位置的字符存哈希表,再去判断当前字符的个数是否大于1,如果大于1,那就让 left 位置的字符出窗口,然后 left++,直到当前字符个数为1为止。 
  • 每次判断完,更新一下字符串的长度即可。
  • 最后返回更新的字符串的长度。 

 这种解法,我们不必每次发现重复的字符都要从当前字符的下一个开始遍历,这样的遍历方法最后依然会碰到那个重复的字符,比如:

  • 当前 right 位置发现重复字符a

  • 如果此时从 left 的下一个位置遍历

  • 那么无论如何仍然会碰到那个重复字符a: 

 所以,干脆当我们遇到重复字符的时候,更新字符串长度,然后直接让 left 跳过这个重复字符即可。

此时 right 也不用回退回去找 left 去了。

下面的大致的一个执行流程:

二、源代码 

class Solution {public int lengthOfLongestSubstring(String s) {int hash[] = new int[128];char str[] = s.toCharArray();int ret = 0;int left = 0;int right = 0;int n = str.length;while (right < n){hash[str[right]]++;while (hash[str[right]] > 1){hash[str[left]]--;//发现重复字符,出窗口left++;}ret = Math.max(ret,right - left + 1);right++;}return ret;}
}


✨好啦,今天的分享就到这里!

🎉希望各位看官读完文章后,能够有所提升。

✨创作不易,还希望各位大佬支持一下!

👍点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论:你的意见是我进步的财富!

 

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

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

相关文章

【Linux】进程周边006之进程地址空间

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.程序地址空间 1.1验证地址…

干货 | 如何通过度量研发效能,多角度洞察百人敏捷团队的价值交付?

随着软件行业的快速发展&#xff0c;高效的研发效能已成为企业竞争力的关键因素。尤其对于具有一定人数规模的敏捷研发团队&#xff0c;如何在复杂的项目环境中客观衡量研发效能&#xff0c;更是团队和管理者面临的重要课题。这不仅关系到项目的质量、交付速度&#xff0c;更直…

Java的字节码操作框架ASM详解

文章目录 一、ASM介绍1. 简介2. 基本概念3. Java ASM的应用场景 二、ASM基本使用1. 基本使用2. Java ASM主要组件3. Java ASM使用组件准备4. 修改字节码 三、Java ASM高级技巧1. 自定义类加载器2. 动态代理 一、ASM介绍 1. 简介 ASM是一个用于在Java字节码级别进行操作的框架…

【Webapck学习】

1、webpack是什么 Webpack是一个前端模块化方案&#xff0c;更侧重于模块打包。我们可以把开发中的所有资源(图片&#xff0c;js,css,字体等) 都看成模块&#xff0c;通过loader和plugins对资源进行处理&#xff0c;打包成符合生产环境部署的前端资源 初始化项目&#xff0c;得…

操作系统之银行家算法

Dijkstra在1965年提出的银行家算法是著名的死锁避免算法&#xff0c;这个用于一个银行家给多个顾客贷款的算法可以直接用于操作系统给进程分配资源&#xff0c;这时只要把银行家换成操作系统&#xff0c;把顾客换成进程&#xff0c;把资金换成资源&#xff0c;把银行家决定是否…

Dbvis 链接Oracle数据库

安装 Dbvisualizer 后 1&#xff0c;打开Dbvisualizer&#xff0c;单机左键 图片标注处。 2&#xff0c;点击右键&#xff0c;显示。 3&#xff0c;点击Creat Datebase Connection 4,点击 use wizard &#xff0c;填写 地址&#xff0c;下一步 5&#xff0c;选择 Orcal Thin …

【SQL】根据年份,查询每个月的数据量

根据年份&#xff0c;查询每个月的数据量 一种 WITH Months AS (SELECT 1 AS Month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION…

Ubuntu 常用命令之 netstat 命令用法介绍

netstat 是一个非常有用的命令行工具&#xff0c;它可以帮助我们监控和诊断网络问题。在 Ubuntu 系统中&#xff0c;我们可以使用 netstat 命令来查看网络连接、路由表、接口统计等信息。 netstat 命令的参数有很多&#xff0c;以下是一些常见的参数 -a&#xff1a;显示所有连…

Ubuntu 常用命令之 ifconfig 命令用法介绍

ifconfig 是一个用于配置和显示 Linux 内核中网络接口的系统管理命令。它用于配置&#xff0c;管理和查询 TCP/IP 网络接口参数。 ifconfig 命令的参数有很多&#xff0c;以下是一些常见的参数 up&#xff1a;激活指定的网络接口。down&#xff1a;关闭指定的网络接口。add&a…

外汇天眼:高雄男子投资1170万获利领不出,惊觉遭诈果断报警设局逮车手; SKYTOPTRADE遭FCA示警具投资风险

拜日益发达的网络科技所赐&#xff0c;现代人只要拥有一支智能手机&#xff0c;想要投资股票、期货、外汇、加密货币绝非难事。 然而&#xff0c;近年来假投资诈骗十分猖獗&#xff0c;造成许多民众相当严重的金钱损失&#xff0c;如今已经成为不可忽视的社会问题。 不久前&…

一篇文章教会你使用VSCode搭建Python开发环境

前言 Python是一门高级的通用编程语言&#xff0c;适用于广泛的领域和应用场景&#xff0c;主要应用领域如数据科学、Web开发、自动化测试、网络爬虫、游戏开发、人工智能、机器学习等。对于大多数普通人而言在日常开发中&#xff0c;我们应用最多的还是利用Python脚本来完成数…

nodejs使用nodejieba

Nodejieba是一个基于Node.js平台的中文分词模块&#xff0c;用于将中文文本切分成有意义的词汇。它是结巴中文分词的Node.js版本&#xff0c;结巴分词是一种开源的中文分词工具&#xff0c;广泛应用于中文自然语言处理领域 优点 高性能&#xff1a; Nodejieba的底层实现采用了…