【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 * 104
  • s 由英文字母、数字、符号和空格组成

思路:

  1. 弄个哈希表,表用来存放s字符串中每个ASCII码出现的下标位置,一开始先设置为空,即没有ASCII码在里面
  2. 每次右窗口移动时,都要比较窗口的长度和检查有没有重复的字符出现,没有就加到哈希表里面
  3. 弄个右指针表示右窗口,先往右移动,如果当前右窗口的边界指向的字符在哈希表里面,那么说明同一个字符重复出现了,取当前找到该字符的最后一个位置作为新的左窗口的一个边界。
/**
 * @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个字符,当然最终还是根据输入集来确定。
posted @ 2022-06-30 13:18  帕图纳克斯  阅读(1051)  评论(0)    收藏  举报