Leecode03. 无重复字符的最长子串——Leecode大厂热题100道系列

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leecode03. 无重复字符的最长子串——Leecode大厂热题100道系列相关的知识,希望对你有一定的参考价值。

我是小张同学,立志用最简洁的代码做最高效的表达


以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言!

传送门——>Leecode大厂热题100道系列题解


问题描述

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

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

示例 4:
输入: s = “”
输出: 0

提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成


解法

  • hash表判重 + 滑动窗口队列

复杂度分析

  • 时间复杂度: O ( N ) O(N) O(N),其中 N N N是字符串的长度。左指针和右指针分别会遍历整个字符串一次。

  • 空间复杂度: O ( ∣ Σ ∣ ) O(|\\Sigma|) O(Σ),其中 Σ \\Sigma Σ表示字符集(即字符串中可以出现的字符), ∣ Σ ∣ |\\Sigma| Σ表示字符集的大小。在本题中没有明确说明字符集,因此可以默认为所有 ASCII 码在 [ 0 , 128 ) [0, 128) [0,128)内的字符,即 ∣ Σ ∣ = 128 |\\Sigma| = 128 Σ=128。我们需要用到哈希集合来存储出现过的字符,而字符最多有 ∣ Σ ∣ |\\Sigma| Σ个,因此空间复杂度为 O ( ∣ Σ ∣ ) O(|\\Sigma|) O(Σ)

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int maxLen = 0;
        unordered_map<char, int>um;
        queue<char>q;
        for(int i = 0; i < s.length(); i++) {
            q.push(s[i]);
            um[s[i]]++;
            if(um[s[i]] == 1) maxLen = max(q.size(), maxLen);
            if(um[s[i]] > 1) {
                while(um[s[i]] > 1) {
                    um[q.front()]--;
                    q.pop();
                }
            }
        }
        return maxLen;
    }
    int max(int a, int b) {
        return a > b ? a : b;
    }
};

孤独是非常有必要的,一个人在孤独时间所做的事,决定了这个人和其他人根本的不同。

以上是关于Leecode03. 无重复字符的最长子串——Leecode大厂热题100道系列的主要内容,如果未能解决你的问题,请参考以下文章

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

Leecode-无重复字符的最长子串

LeeCode 无重复字符串的最长子串

LeeCode 无重复字符串的最长子串

leecode第三题(无重复字符的最长子串)

leecode-找出其中不含有重复字符的 最长子串 的长度