力扣-hot100(无重复字符的最长子串)

3. 无重复字符的最长子串

中等

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

示例 1:

复制代码
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

暴力直观解法一:

思路: 手动看题: -> O -> 不重复字符? os: 有没有这样一种数据结构....,有的兄弟有的。队列报你身份证了。 维护一个队列,每次往队列中加入元素,就去看看队列中是否有一个相同的元素已经在里面了,如果有,就把元素从前往后进行结算,再将该元素加入队列中,以此类推,得到最长子串.

复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
        Queue<Character> queue = new LinkedList<>();
        int n = s.length();
        int maxlen = 0;
        int len = 0;
        for(int i = 0; i < n; i ++){
            char c = s.charAt(i);
            // 判断队列中是否存在这么一个元素
            boolean std = queue.contains(c);
            // 还存在重复元素则把前面的不断进行移除
            if(std){
                while(queue.contains(c)){
                     queue.remove();
                     len--;
                }
            }
            // 移除完了就可以加入进行 
            queue.add(c);
            len ++;
            maxlen = Math.max(maxlen, len);
        }
        return maxlen;
    }
}

执行用时分布 18ms 击败10.70%

神魔 才10.70% OVO。观察上述代码主要耽误我时间的地方就是检查这个元素 queue.contains(c); -> O(n)。神魔在我的代码中怎么能有这种坏东西。

不服,再来

解法二: 用Set来维护这些元素(set.contains(c)的时间复杂度为O(1)),那怎么保留队列的性质呢? 我们只需要在加入元素的时候一直加加加,加到厌倦(出现了重复元素),然后移除的时候只需要移除掉那个重复元素就行

复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
        Set<Character> set = new HashSet<Character>();
        int len = s.length();
        int right = 0;
        int maxNumber = 0;
        for(int i = 0; i < len; i ++){
            // 除了第一次加入元素外,其它都是上一轮加到重复了才会停止,所以将上一个字符移除
            if(i != 0) set.remove(s.charAt(i - 1));
​
            // 加加加,加到厌倦
            while(right < len && !set.contains(s.charAt(right))){
                set.add(s.charAt(right));
                right ++;
            }
            maxNumber = Math.max(maxNumber, right  - i);
        }
        return maxNumber;
    }
}

6ms击败 67.99%

相关推荐
Code哈哈笑12 分钟前
【机器学习】支持向量回归(SVR)从入门到实战:原理、实现与优化指南
人工智能·算法·机器学习·回归·svm
努力学习的小廉23 分钟前
【C++】 —— 笔试刷题day_29
开发语言·c++·算法
小羊在奋斗25 分钟前
【LeetCode 热题 100】搜索插入位置 / 搜索旋转排序数组 / 寻找旋转排序数组中的最小值
算法·leetcode·职场和发展
meisongqing31 分钟前
【软件工程】符号执行与约束求解缺陷检测方法
人工智能·算法·软件工程·软件缺陷
莫叫石榴姐1 小时前
如何为大模型编写优雅且高效的提示词?
人工智能·算法
_星辰大海乀1 小时前
表的设计、聚合函数
java·数据结构·数据库·sql·mysql·数据库开发
Echo``2 小时前
1:OpenCV—图像基础
c++·图像处理·人工智能·opencv·算法·计算机视觉·视觉检测
COOCC13 小时前
激活函数全解析:定义、分类与 17 种常用函数详解
人工智能·深度学习·神经网络·算法·机器学习·计算机视觉·自然语言处理
林下清风~3 小时前
力扣hot100——347.前K个高频元素(cpp手撕堆)
算法·leetcode·职场和发展
小雅痞3 小时前
[Java][Leetcode middle] 238. 除自身以外数组的乘积
java·leetcode