前端Vue专辑每日一题让前端飞

第2题-无重复字符的最长子串

2019-08-10  本文已影响2人  青天诀

面试题目(字节跳动)

给定一个字符串,找出其中无重复字符的最长子字符串长度。

示例:

  1. 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
  2. 给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
  3. 给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。

答案解析:

1. 常规解法

function maxLen(str) {
    var start = 0;
    var end = 0;
    var max = 0;
    for(var i = 0, len = str.length; i < len; i++) {
        var curStr = str.substring(start, end + 1);
        for(var j = end + 1; j < len; j++) {
            if(curStr.indexOf(str[j]) >= 0) {
                max = Math.max(max, end - start + 1);
                start++;
                if(start > end) {
                    end++;
                    i++;
                }
                break;
            } else {
                curStr += str[j];
                end++;
                max = Math.max(max, end - start + 1);
            }
        }
    }
    return max;
}
console.log(maxLen('abcabcbb'))

2. 高性能解法

function maxLen(str) {
    var start = 0;
    var end = 0;
    var max = 0;
    for(var j = 1, len = str.length; end <= len, j < len;) {
        var curStr = str.substring(start, end + 1);
        if(curStr.indexOf(str[j]) >= 0) {
            max = Math.max(max, end - start + 1);
            start++;
            if(start > end) {
                end++;
                j++;
            }
        } else {            
            end++;
            j++;
            max = Math.max(max, end - start + 1);
        }
    }
    return max;
}
console.log(maxLen('abaaa'))

知识点:

substring

定义: substring()方法用于提取字符串中介于两个指定下标之间的字符。

语法: stringObject.substring(start,stop)

参数 描述
start 必需。一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置。
stop 可选。一个非负的整数,比要提取的子串的最后一个字符在 stringObject 中的位置多 1。如果省略该参数,那么返回的子串会一直到字符串的结尾。

注意:

  1. substring() 方法返回的子串包括 start 处的字符,但不包括 stop 处的字符。
  2. 如果参数 start 与 stop 相等,那么该方法返回的就是一个空串(即长度为 0 的字符串)。如果 start 比 stop 大,那么该方法在提取子串之前会先交换这两个参数。

substr

定义: substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。

语法: stringObject.substr(start,length)

参数 描述
start 必需。要抽取的子串的起始下标。必须是数值。如果是负数,那么该参数声明从字符串的尾部开始算起的位置。也就是说,-1 指字符串中最后一个字符,-2 指倒数第二个字符,以此类推。
length 可选。子串中的字符数。必须是数值。如果省略了该参数,那么返回从 stringObject 的开始位置到结尾的字串。

注意:

  1. 一个新的字符串,包含从 stringObject 的 start(包括 start 所指的字符) 处开始的 length 个字符。如果没有指定 length,那么返回的字符串包含从 start 到 stringObject 的结尾的字符。

二者区别:


扫一扫 下方二维码,关注我的公众号【前端名狮】,更多精彩内容陪伴你!

【前端名狮】
上一篇 下一篇

猜你喜欢

热点阅读