[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;
    }
}
相关推荐
Escalating_xu1 分钟前
【Linux线程同步】从数据竞争到 mutex、条件变量与生产者消费者(上篇)
android·java·linux
承渊政道12 分钟前
10:30提交预约会不会撞上10:00的会议?我用飞算JavaAI3.9.1和3.9.9跑了四个时间段
java·springboot·ai编程·飞算javaai·java代码生成
运维行者_13 分钟前
预测性云监控怎么做?AI驱动的7大核心能力与落地路径
服务器·开发语言·网络·数据库·人工智能·python·php
SL_staff14 分钟前
风控规则如何从硬编码解耦?我们在 JVS-Rules 中的实践与思考
java·spring boot·设计模式
名字还没想好☜23 分钟前
Next.js Route Handler 做 SSE 服务端推送:实时进度条、自动重连与什么时候别用 WebSocket
开发语言·javascript·websocket·react·sse·next.js
数据库技术讲堂24 分钟前
从 GitOps 到数据库变更:NineData 如何打通 CI/CD 的数据库治理链路
java·数据库·ci/cd
进制树25 分钟前
【飞控开发实战·㉒】ROS2无人机应用开发实战:Offboard控制、航点任务、AprilTag降落与避障系统
开发语言·安全·无人机·课程设计
深海呐35 分钟前
Java 位运算符的实际应用:不止面试刷题,业务同样能用
java·位运算符·java 位运算·java 开发技巧·状态位设计·java 高阶用法·位运算符实战
江畔柳前堤36 分钟前
LLM + Agent 模型效果评估:从入门到工业级体系构建的完整指南
开发语言·人工智能·自然语言处理·chatgpt·架构·json·batch
2602_9599609237 分钟前
电商场景Java面试:Spring Boot、JVM、Redis、Kafka、微服务与分布式事务考点解析——谢飞机的作死面试记
java·jvm·spring boot·redis·面试题