LeetCode刷题---无重复字符的最长子串(3)

    技术2022-07-13  85

    题目

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

    示例 1:

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

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

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

    思路

    主要是利用滑窗的思想。

    解法

    ES5的方法:

    /** * @param {string} s * @return {number} */ var lengthOfLongestSubstring = function(s) { var str = ""; var len = 0; for(var i=0;i<s.length;i++){ if(str.indexOf(s[i])==-1){ str = str+s[i]; }else{ //因为后面会有删去字符的操作,故在这步就要统计字符的长度 if(str.length>len){ len = str.length; } while(str.indexOf(s[i])!=-1){ //去掉组成字符串的第一个字符,直到不含有下一个字符为止 str = str.slice(1); } str = str+s[i]; } if(str.length>len){ len = str.length; } } return len; };

    ES6的方法:

    var lengthOfLongestSubstring = function(s) { var set = new Set(); var maxlen = 0; //因为set的delete方法不能按照索引删去第一个字符?只能删去对应的值? //所以这里把j当成一个指针,s[j]可得要删去的字符 var j = 0 for(let i=0;i<s.length;i++){ if(!set.has(s[i])){ set.add(s[i]) }else{ maxlen = set.size>maxlen?set.size:maxlen while(set.has(s[i])){ set.delete(s[j]) j++ } set.add(s[i]) } maxlen = set.size>maxlen?set.size:maxlen } return maxlen };
    Processed: 0.012, SQL: 9