手撕算法-无重复字符的最长子串

描述

分析

滑动窗口,记录窗口中的所有出现的字符,然后窗口左边界固定,右边界右滑,如果,窗口中不存在新的字符,则右滑成功,否则左边界右滑,直到窗口中不存在右边界的值。

描述感觉不清晰,直接看代码吧!!

代码

版本1:

java 复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int left = 0, right = 0;
        Set<Character> set  = new HashSet<>();

        int max = 0;

        while(right < s.length()) {
            if(!set.contains(s.charAt(right))) {
                set.add(s.charAt(right));
                right++;
            } else {
                set.remove(s.charAt(left));
                max = Math.max(max, right - left);
                left++;
            }
        }

        // 最后到终点了,也要再次判断最长长度
        max = Math.max(max, right - left);

        return max;
    }
}

版本2:(面试官推荐的版本)

java 复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map<Character, Integer> dic = new HashMap<>();
        int i = -1, res = 0, len = s.length();
        for(int j = 0; j < len; j++) {
            if (dic.containsKey(s.charAt(j)))
                i = Math.max(i, dic.get(s.charAt(j))); // 更新左指针 i
            dic.put(s.charAt(j), j); // 哈希表记录
            res = Math.max(res, j - i); // 更新结果
        }
        return res;
    }
}

面试公司

阿里

相关推荐
战族狼魂3 分钟前
MetaPrompt编译器核心逻辑拆解
开发语言·人工智能·python
硅谷秋水5 分钟前
Qwen-VLA:跨任务、环境与机器人形态的视觉-语言-动作统一建模
人工智能·深度学习·算法·计算机视觉·语言模型·机器人
gihigo19989 分钟前
MATLAB实现光谱特征波长提取
开发语言·matlab
代钦塔拉11 分钟前
Qt信号槽参数类型全解:原生类型、结构体、enum class强枚举注册与传参实战
开发语言·qt
SXJR12 分钟前
langchain4j是如何保证tools或者funcation call不出错的
java·网络·数据库·ai·语言模型
dinl_vin18 分钟前
Python 并发编程实战:多线程、协程与多进程全解析
开发语言·人工智能·python
程序大视界20 分钟前
【C++ 从基础到项目实战】C++(五):类与对象基础——构造、析构与访问控制
开发语言·c++·cpp
子一!!20 分钟前
spring基础学习
java·学习·spring
代码中介商20 分钟前
掌握C++ std::bind:参数绑定与灵活调用
开发语言·c++
拽着尾巴的鱼儿25 分钟前
Java 对象的深拷贝和浅拷贝
java·开发语言