【技术分享-真题实战】求最长无重复字符子串 (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;
}




相关文章
|
5月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
5月前
|
安全 Java 开发者
告别NullPointerException:Java Optional实战指南
告别NullPointerException:Java Optional实战指南
318 119
|
6月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
2207 8
|
6月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
985 12
|
6月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
542 100
|
6月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
749 0
|
7月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
275 2
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
295 3
|
6月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案