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

描述

分析

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

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

代码

版本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;
    }
}

面试公司

阿里

相关推荐
Wang's Blog几秒前
Java 项目实战: 交友项目 - 圈子互动章总结与自检清单
java·bootstrap·交友
moshuying14 分钟前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法
云和数据.ChenGuang16 分钟前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节
没落之王27 分钟前
历史系统建模:宋初太祖太宗「再立天庭」秩序重构推演
人工智能·算法·重构
xyouyuweizhu37 分钟前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
代码方舟1 小时前
零信任架构实战:基于天远人企关联构建自动化供应链核心企业关联穿透与利益冲突审查网关
java·人工智能·架构·自动化
INGNIGHT1 小时前
91 · 最小调整代价(序列dp)
数据结构·算法·leetcode
moshuying1 小时前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法
小超人诞生日记1 小时前
C++ 异常机制详解:从抛出捕获到异常安全
c++·算法
多弗朗皮卡丘1 小时前
C++的IO流
开发语言·c++·io流·文件io流