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道系列的主要内容,如果未能解决你的问题,请参考以下文章