LeetCode:无重复字符的最长字串

方法一:

java 复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
        //记录当前有哪些字符
        Set<Character> windoeSet = new HashSet<>();

        int left = 0;
        //最大长度
        int maxLength = 0;
        //挨个遍历
        for(int right = 0;right < s.length();right++){
            //用于存放
            char incomingChar = s.charAt(right);

            while(windoeSet.contains(incomingChar)){
                //用于删除
                char outcomingChar = s.charAt(left);
                windoeSet.remove(outcomingChar);
                left++;
            }
            windoeSet.add(incomingChar);
            maxLength = Math.max(maxLength,right - left + 1);
        }
        return maxLength;
    }
}

方法二:

java 复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
        //记录每个字符上次出现的位置
        int[] indexMap = new int[128];

        int left = 0;
        int maxLength = 0;

        for(int right = 0;right < s.length();right++){
            //获取当前字符的ASCII码(Java里的char可以直接当作int用)
            char c = s.charAt(right);
            //查这个字符上次出现的位置
            //没出现过,indexMap[c]就是0,Math.max会让left保持原地不变
            //出现过,left直接到它上次出现的下一个位置(不能往回退)
            left = Math.max(left,indexMap[c]);
            maxLength = Math.max(maxLength,right - left +1);
            //存位置时,将位置+1
            indexMap[c] = right + 1;
        }
        return maxLength;
    }
}

时间:

第二种方法少一个while循环;相对于第一种的HashSet,第二种使用数组,时间提升;

第一段的remove产生内存垃圾,Java的垃圾回收器清理他们,拖慢时间

空间:

第一种使用Character涉及到对象,吃内存;而第二种只使用数组

相关推荐
GoAI4 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi4 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M7 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen7 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷9 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方9 小时前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん10 小时前
【C++】哈希表
c++·算法·散列表
地平线开发者11 小时前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶
武子康13 小时前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法