【JS】3.无重复字符的最长子串
3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104s由英文字母、数字、符号和空格组成
思路:
- 弄个哈希表,表用来存放
s字符串中每个ASCII码出现的下标位置,一开始先设置为空,即没有ASCII码在里面 - 每次右窗口移动时,都要比较窗口的长度和检查有没有重复的字符出现,没有就加到哈希表里面
- 弄个右指针表示右窗口,先往右移动,如果当前右窗口的边界指向的字符在哈希表里面,那么说明同一个字符重复出现了,取当前找到该字符的最后一个位置作为新的左窗口的一个边界。
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let map = new Map(),
left=0,
result=0;
for(let right=0;right<s.length;right++){
if(map.has(s[right])){
left=Math.max(map.get(s[right]),left);
}
result=Math.max(result,right-left+1);
map.set(s[right],right+1);
}
return result;
};
复杂度分析
- 时间复杂度:\(O(N)\),其中 \(N\) 是字符串的长度。因为我就用了一个循环,其中右指针一定会遍历完整个字符串,而最坏的情况下,左指针也跟着右指针一同遍历完整个字符串,一般在写这题的时间复杂度时,由于只是在一个循环下,所以不把左指针的遍历情况考虑进去。
- 空间复杂度:\(O(|\Sigma|)\),其中 \(\Sigma\) 表示字符集(即字符串中可以出现的字符),就表示一个范围,因为题目明说了是
ASCII码,最坏的情况也就存储128个字符,当然最终还是根据输入集来确定。

浙公网安备 33010602011771号