3. 无重复字符的最长子串

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

示例 1:优化

输入: "abcabcbb"
输出: 3
解释: 由于无重复字符的最长子串是 "abc",因此其长度为 3。spa

示例 2:code

输入: "bbbbb"
输出: 1
解释: 由于无重复字符的最长子串是 "b",因此其长度为 1。图片

示例 3:leetcode

输入: "pwwkew"
输出: 3
解释: 由于无重复字符的最长子串是 "wke",因此其长度为 3。字符串

请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解答:
1.暴力破解string

var lengthOfLongestSubstring = function(s) {
    var l = s.length;
    var re = 0;
    for (var i= 0; i < l; i++) { //1
        for(var j = i + 1; j <= l; j++){ //2
           if(check(i, j)) {
               re = Math.max(re, j - i)
           } else {
               break
           }
        }
    }
    function check(start, end) {
        var a  = [];
        for (var k = start; k < end; k++) { //3
            if (a.indexOf(s[k]) !== -1) {
                return false
            } else {
                a.push(s[k])
            }
        }
        return true;
    }
    return re
};

上来就是一顿for循环操做,这样暴力写咱们的leetcode确定是不会给过的,由于遇到超级长的字符串测试用例,执行时间会超出时间限制,上面代码的优化空间很大。
理一下逻辑,咱们每次在2里面检测出有重复的字符时,记录这个重复字符前一次出现的位置index,而后中断此次循环,开始下一次1的循环,而且i的位置应该为index+1。
图片描述
好比在i=0的时,在2循环里j=4时就会出现重复的字符d,字符d前一次出现的位置是1,这时最长字符串长度是4,而且被记录,这时应该开始1循环的下一次循环,而且是从i=2开始。
3循环和2循环实际上是没必要要的,咱们建立一个动态的字符串,把每次循环到的字符加进去并实时记录它的长度,遇到重复的字符串就砍掉字符第一次出现跟它以前的字符串,好比上图,i循环到4时,出现重复字符d,d在以前出现的位置是1,咱们应该砍掉动态字符串位置1跟它以前的字符串,来保证它是无重复的字符串。代码以下it

var lengthOfLongestSubstring = function(s) {
    var l = s.length;
    var re = 0;
    var a = '', index;
    for (var i = 0; i < l; i++) {
        index = a.indexOf(s[i])
        if (index !== -1) {
            a = a.slice(index + 1)
        }
        a+=s[i]
        re = Math.max(re, a.length);
        
    }

    return re
};

图片描述
一下从矮穷挫变成高富帅,速度杠杠哒!io

相关文章
相关标签/搜索