[Java][Leetcode middle] 3. 无重复字符的最长子串

暴力,肯定超时

1. 自己想的

oN2

暴力版本的滑动窗口

对于已经通过检验的子串,一定是没有重复的。如果子串和下一个字符进行查找是否存在重复(indexOf),如果存在重复,先计算前面子串的长度,然后start就跳到存在重复的index的下一个字符,此时从start+ index + 1end形成的子串此时还是没有重复的。

例如对于abcdebg

  • 遇到第二个b之前,子串是abcde
  • 遇到第二个b之后,计算子串长度为5,然后形成新的子串cdeb,此时的子串仍然是没有重复元素的。
  • 下一个循环继续往后进行比较

这样做的好处: 避免了每次出现重复字母后需要重新回溯到开头重新比较的问题。

java 复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
        // abcdeb  遇到重复的,跳到第一个b的index+1;
        int n = s.length();
        if(n == 0) return 0;

        // 第一个元素肯定满足条件:子串为1
        int res = 1;
        int start = 0,end = 1;

        while(end < n){
            //  abcd  循环到c时,取ab出来
             int subIndex = s.substring(start, end).indexOf(s.charAt(end));
             if(start != end &&   subIndex >= 0){
                    res = Math.max(res, end - start);
                    start += subIndex + 1;
             } 
             
             end++;
            
        }
        res = Math.max(res, end - start);
        return res;

    }
}

2. 官解: 滑动窗口 + 数组

oN

我的思路没有问题,但是String.indexOf() 这个判断有没有重复字符的时候太费时间了。

  • 使用一个足够长的数组lastIndex[128]来记录字符的下一个位置
  • right 向右扩展,遇到重复字符时移动 left 到重复字符的下一个位置,使子串无重复。
  • 每次记录窗口的最大长度
java 复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int left = 0,maxLen = 0;
        int[] lastIndex = new int[128];

        for(int right = 0; right<s.length();right ++){
            char c = s.charAt(right);
            left = Math.max(left, lastIndex[c]);
            maxLen = Math.max(maxLen, right - left + 1);
            lastIndex[c] = right + 1;  // 记录字符的下一个位置
        }

        return maxLen;
    }
}
相关推荐
wzdark14 分钟前
基于链表的内存池设计与内存复用机制4
java·数据结构·链表
潜创微科技26 分钟前
IT6520:USB-C 转 MIPI 高集成控制器,DP 1.4a 转 MIPI 单芯片搞定 4K120 显示
c语言·开发语言·低延迟·掌机·联阳
cnkeysky44 分钟前
idea 中的 maven 项目重新加载子模块
java·idea
Escalating_xu1 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
今天AI了吗1 小时前
什么是 AI Agent?它与直接调用大模型 API 有何区别
java·网络·人工智能·架构·java-ee
傲世仙尊1 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
隐退山林1 小时前
JavaEE进阶:SpringAOP
java·java-ee
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之方法级安全注解
java·安全·spring
cvby1 小时前
C++11
开发语言·c++
JavacKaka1 小时前
LiteFlow规则引擎实战博客-2026-09-09
java