3. 无反复字符的最宗子串

问题:给定一个字符串,请你找出个中不含有反复字符的 最宗子串 的长度。

示例 1:

输入: “abcabcbb”
输出: 3
诠释: 由于无反复字符的最宗子串是 “abc”,所以其长度为 3。

示例 2:

输入: “bbbbb”
输出: 1
诠释: 由于无反复字符的最宗子串是 “b”,所以其长度为 1。

示例 3:

输入: “pwwkew”
输出: 3
诠释: 由于无反复字符的最宗子串是 “wke”,所以其长度为 3。

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

解答:
1.暴力破解

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。
《3. 无反复字符的最宗子串》
比方在i=0的时,在2轮回里j=4时就会涌现反复的字符d,字符d前一次涌现的位置是1,这时候最长字符串长度是4,而且被纪录,这时候应当最先1轮回的下一次轮回,而且是从i=2最先。
3轮回和2轮回实际上是不必要的,我们建立一个动态的字符串,把每次轮回到的字符加进去并及时纪录它的长度,碰到反复的字符串就砍掉字符第一次涌现跟它之前的字符串,比方上图,i轮回到4时,涌现反复字符d,d在之前涌现的位置是1,我们应当砍掉动态字符串位置1跟它之前的字符串,来保证它是无反复的字符串。代码以下

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
};

《3. 无反复字符的最宗子串》
一下从矮穷挫变成高富帅,速率杠杠哒!

    原文作者:ashley8140
    原文地址: https://segmentfault.com/a/1190000017516657
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞