【算法之旅】(No.3-无重复字符的最长子串) | Java刷题打卡

简介: 【算法之旅】(No.3-无重复字符的最长子串) | Java刷题打卡

题目描述


输入参数


  • 输入一个字符串
  • 字符串的长度范围:[0,50000]
  • 字符串内部的字符由英文字母、数字、符号和空格组成



题目逻辑

  • 请你找出输入的字符串中不含有重复字符的最长子串的长度。


输出结果

  • 最长的字符串长度值-整数(0,50000)之间



特别说明:

  • 暂无



题目示例


示例 1

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 
"abc"
所以其长度为 3。
复制代码



示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 
"b"
所以其长度为 1。
复制代码



示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 
"wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是子串。
复制代码



示例 4:

输入: s = ""
输出: 0
复制代码





思路分析


哈希表算法


  1. 定义一个哈希表存放字符及其出现的位置


  1. 定义i, j分别表示不重复子串的开始位置和结束位置


  1. j 向后遍历,若遇到与 [i, j] 区间内字符相同的元素,更新i的值,此时 [i, j] 区间内不存在重复字符,计算res的最大值




AC代码


实现方法

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int res = 0;
        Map<Character, Integer> chars = new HashMap<>();
        for (int start = 0, end = 0; end < s.length(); ++end) {
            char c = s.charAt(end);
            if (chars.containsKey(c)) {
                // chars.get(c)+1 可能比 start 还小,
                // 通过 max 函数来锁住左边界
                // e.g. 在"tmmzuxt"这个字符串中,遍历到最后一步时,
                // 最后一个字符't'和第一个字符't'是相等的。
                // 如果没有 max 函数,start 
                // 就会回到第一个't'的索引0处的下一个位置
                start = Math.max(start, chars.get(c) + 1);
            }
            chars.put(c,end);
            res = Math.max(res, end-start + 1);
        }
        return res;
    }
}
复制代码





总结:


  1. 主要是依靠于HashMap存放遍历过切不重复的字符串,key作为当前字符,value作为索引下标。
  2. 当于到HashMap中存在的key,这说明遇到了重复的字符,结束统计,存放到全局变量里面,进行存储长度



  1. 并且进行下一步统计,根据重复元素的位置(第一个重复的元素)+1 就是重复元素的第二个的下标,进行变更开始坐标,最后进行比较最后一次收尾的长度比较



目录
打赏
0
0
0
0
379
分享
相关文章
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
76 0
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
145 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
25天前
|
java变量与数据类型:整型、浮点型与字符类型
### Java数据类型全景表简介 本文详细介绍了Java的基本数据类型和引用数据类型,涵盖每种类型的存储空间、默认值、取值范围及使用场景。特别强调了`byte`、`int`、`long`、`float`、`double`等基本类型在不同应用场景中的选择与优化,如文件流处理、金融计算等。引用数据类型部分则解析了`String`、数组、类对象、接口和枚举的内存分配机制。
54 15
Java中的字符集编码入门-增补字符(转载)
本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
122 60
|
7月前
|
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
7月前
|
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
228 2
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
55 0