【技术分享-真题实战】求最长无重复字符子串 (Java)

简介: 【题目来源:Leetcode-3】字符串、哈希表、字串

题目详情

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

    请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。


题目分析:

1、求没有重复字符的子串

2、这个子串最长是多少?

3、最长子串必须是连续的

做题思路:

连续的、长度不确定、没有重复

可以使用滑动窗口思想,在使用set去重


什么是滑动窗口思想?

1、双指针思想,两个指针之间的部分可以认为是一个窗口。

2、有固定大小窗口和大小动态变化的窗口。

3、将两个嵌套循环转化为 单层循环。

什么情况下使用滑动窗口?

1、给出的数据结构是数组或者字符串

2、求字串、子序列或者求某个具体值

3、这种问题一般能通过暴力求解

滑动窗口的思路

左右双指针,右指针右移寻找符合的条件,左指针右移,压缩区间

本题思路

1、定义左右指针,左右指针之间的部分代表窗口

2、判断窗口内有没有重复的数

3、如果窗口内有重复的数,左指针右移,缩小范围

4、窗口内没有重复的数,右指针右移,扩大范围

5、记录区间长度


注:

Set 中的contains方法可以用来判断集合中是否包含某元素,Set是一种无序且不允许重复的集合。Set的contains方法使用Hash算法,使用哈希值来快速定位元素的位置,不需要遍历一遍集合。

List的contains方法在判断元素是否存在时需要遍历整个列表,资源较大。

publicstaticintmaxLengthStr(Stringstr){
intmaxLength=0;
Set<Character>set=newHashSet<>();
//定义左右指针,右指针右移扩大窗口区间for(intleft=0,right=0;right<str.length;right++){
//使用set存储并判断窗口中是否包含右指针指向的元素if(set.contains(str.charAt(right))){
//包含说明有重复的,需要从左边开始删除,直到没有重复的while(str.charAt(left) !=str.charAt(right)){
//使用while循环,依次从左边开始删除,直到没有重复的set.remove(str.charAt(left));
left++;
            }
left++;
        }else{
//如果窗口中的元素不等于右指针元素,将右指针元素添加到set中set.add(str.charAt(right))
//将最大长度存入maxLengthif(set.size()>maxLegth){
maxLegth=set.size();
            }
        }
    }
returnmaxLegth;
}




相关文章
|
11天前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
32 6
|
13天前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
22 7
|
14天前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
54 1
|
21天前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
32 2
|
25天前
|
Java 数据处理
技术分享:高效与灵活并存——Java版通用树形结构转换工具的实现与应用
在软件开发中,树形结构的数据表现形式无处不在,从文件系统的目录树到组织架构的部门树,再到各类产品的分类结构。处理这些具有层级关系的数据时,将其转换为树形结构以便展示和操作显得尤为重要。Java作为一门成熟的编程语言,虽然提供了强大的集合框架,但并未直接提供树形结构转换的内置工具。因此,开发一个高效且灵活的通用树形结构转换工具成为许多项目中的必备需求。
29 2
|
4天前
|
Java 数据中心 微服务
Java高级知识:线程池隔离与信号量隔离的实战应用
在Java并发编程中,线程池隔离与信号量隔离是两种常用的资源隔离技术,它们在提高系统稳定性、防止系统过载方面发挥着重要作用。
6 0
|
8天前
|
消息中间件 缓存 Java
RocketMQ的JAVA落地实战
RocketMQ作为一款高性能、高可靠、高实时、分布式特点的消息中间件,其核心作用主要体现在异步处理、削峰填谷以及系统解耦三个方面。
40 0
|
5天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
18 2
|
9天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
13天前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
下一篇
无影云桌面