无重复字符的最长子串

86 阅读2分钟

描述

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

 

示例 1:

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

思路

  分析题目,要求取出不重复的字符串的最长值,那么会想到set结构,set内不允许重复值。 -->定义一个Set
  还要返回最长值,再定义一个变量maxLen存储它。
  再定义一个变量j指向字符串开头,用于遍历字符串时遇到相同值后,去除该值。
  for循环遍历字符串(i为下标),
        判断set内是否存在s[i],如果没有,则添加到set,并且每次添加值都要判断当前的maxLen和set.size谁大,并且把他赋值给maxLen
        如果有,那么将j对应的值从set中删除,然后j++,直到set内不存在s[i],因为j也是从0增大的,他和i遍历的数的顺序相同,必定能找到满足s[i]===s[j]的值,然后删除它,之后再添加s[i],当添加是就会执行第一个判断语句,从而更新maxLen。

代码

        var lengthOfLongestSubstring = function (s) {
            //定义一个Set结构,存放字符串内的值,
                //因为set内不允许存在相同值,所以set的最大长度必定是不重复字符串的最大长度
            //定义两个指针,一个用于遍历字符串,另一个用于判定set内是否存在该值
            //定义一个变量存放最大长度maxLength
                // for循环遍历字符串s,
                    // 如果set内不存在该值,那么把它添加到里面,并且每次添加都要判定maxLength和set的长度谁大,就将谁赋值给maxLength
                    // 如果存在,那么删除该值,并将j++,循环直到该值不存在,然后将该值再次添加到set内,遍历继续                
            // 等到遍历结束,返回最大值
            var set = new Set();
            var i = 0,j = 0, maxLength = 0;
            if(s.length === 0) return 0;


            for(i; i < s.length; i++){
                if(!set.has(s[i])){
                    set.add(s[i]);
                    maxLength = Math.max(maxLength,set.size)
                }else{
                    while(set.has(s[i])){
                        set.delete(s[j]);
                        j++;
                    }


                    set.add(s[i]);
                }
            }
            return maxLength;
        };