LeetCode刷题笔记 | 3 | 无重复字符的最长子串 | 双指针 | 滑动窗口 | 2025兴业银行秋招笔试题 | 哈希集合

🙋大家好!我是毛毛张!
🌈个人首页: 神马都会亿点点的毛毛张 这是一道银行的面试题,就是简单?!


LeetCode链接:3. 无重复字符的最长子串


1.题目描述

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 0 < = s . l e n g t h < = 5 ∗ 1 0 4 0 <= s.length <= 5 * 10^4 0<=s.length<=5∗104
  • s 由英文字母、数字、符号和空格组成

2.题解

  • 盲猜暴力解法肯定超时,毛毛张就不在这里介绍了
  • 这个题目只需要最长子串的长度,做完可以尝试一下这道题目:LeetCode:67.最小覆盖子串

2.1 双指针-哈希集合

java 复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 使用一个Set来存储当前子串中的字符
        Set<Character> set = new HashSet<>();
        // 初始化左右指针和最大长度
        int left, right;
        int maxLen = 0;

        // 从左到右遍历字符串
        for (left = 0, right = 0; right < s.length(); right++) {
            // 获取当前字符
            Character c = s.charAt(right);

            // 如果当前字符不在Set中,更新最大长度
            if (!set.contains(c)) {
                maxLen = Math.max(maxLen, right - left + 1);
            }

            // 如果当前字符在Set中,则移动左指针直到没有重复字符
            while (set.contains(c)) {
                set.remove(s.charAt(left));
                left++;
            }

            // 将当前字符添加到Set中
            set.add(c);
        }

        // 返回最大长度
        return maxLen;
    }
}

2.2 双指针-哈希数组

  • 如果能用哈希集合,那么大概率也可以使用哈希数组
java 复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 使用一个大小为128的整数数组来记录字符出现的次数
        int[] arr = new int[128];
        // 初始化左右指针和最大长度
        int left, right;
        int maxLen = 0;

        // 从左到右遍历字符串
        for (left = 0, right = 0; right < s.length(); right++) {
            // 获取当前字符
            char c = s.charAt(right);

            // 如果当前字符在数组中的计数为0,更新最大长度
            if (arr[c] == 0) {
                maxLen = Math.max(maxLen, right - left + 1);
            }

            // 如果当前字符在数组中的计数不为0,则移动左指针直到没有重复字符
            while (arr[c] != 0) {
                arr[s.charAt(left)]--;
                left++;
            }

            // 将当前字符的计数加1
            arr[c]++;
        }

        // 返回最大长度
        return maxLen;
    }
}
相关推荐
上上迁10 分钟前
分布式接口幂等性的演进和最佳实践,含springBoot 实现(Java版本)
java·spring boot·分布式
匚WYHaovous11 分钟前
Java断言的深度解析与实战指南
java
岑梓铭16 分钟前
计算机网络第九章——数据链路层《局域网》
网络·笔记·计算机网络·考研·408
无聊的小坏坏20 分钟前
力扣 239 题:滑动窗口最大值的两种高效解法
c++·算法·leetcode
WanderInk23 分钟前
揭秘Java协变返回类型:让你的API少一点强转,多一点优雅
java·后端
黎明smaly23 分钟前
【排序】插入排序
c语言·开发语言·数据结构·c++·算法·排序算法
njsgcs31 分钟前
cad_recognition 笔记
笔记
paopaokaka_luck34 分钟前
基于SpringBoot+Vue的非遗文化传承管理系统(websocket即时通讯、协同过滤算法、支付宝沙盒支付、可分享链接、功能量非常大)
java·数据库·vue.js·spring boot·后端·spring·小程序
YuTaoShao36 分钟前
【LeetCode 热题 100】206. 反转链表——(解法一)值翻转
算法·leetcode·链表
iteye_993936 分钟前
让 3 个线程串行的几种方式
java·linux