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

2023-12-21 15:20

本文主要是介绍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;}
}


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

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

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

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

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

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

 

这篇关于LeetCode 取经之路——第三题-无重复长度的最长子串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/520504

相关文章

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.