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

面试题目(字节跳动)

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

示例:

  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. 如果参数 startstop 相等,那么该方法返回的就是一个空串(即长度为 0 的字符串)。如果 startstop 大,那么该方法在提取子串之前会先交换这两个参数。


substr

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

语法: stringObject.substr(start,length)

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

注意:

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

二者区别:

  • substring(start,end)返回指定下标间的字符,下标必须为正整数

  • substr(start,length)返回从指定下标开始的长度为length的字符,可以为负数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值