第2题-无重复字符的最长子串
2019-08-10 本文已影响2人
青天诀
面试题目(字节跳动)
给定一个字符串,找出其中无重复字符的最长子字符串长度。
示例:
- 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
- 给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
- 给定 "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。如果省略该参数,那么返回的子串会一直到字符串的结尾。 |
注意:
-
substring()
方法返回的子串包括 start 处的字符,但不包括 stop 处的字符。 - 如果参数 start 与 stop 相等,那么该方法返回的就是一个空串(即长度为 0 的字符串)。如果 start 比 stop 大,那么该方法在提取子串之前会先交换这两个参数。
substr
定义: substr()
方法可在字符串中抽取从 start 下标开始的指定数目的字符。
语法: stringObject.substr(start,length)
参数 | 描述 |
---|---|
start | 必需。要抽取的子串的起始下标。必须是数值。如果是负数,那么该参数声明从字符串的尾部开始算起的位置。也就是说,-1 指字符串中最后一个字符,-2 指倒数第二个字符,以此类推。 |
length | 可选。子串中的字符数。必须是数值。如果省略了该参数,那么返回从 stringObject 的开始位置到结尾的字串。 |
注意:
- 一个新的字符串,包含从 stringObject 的 start(包括 start 所指的字符) 处开始的 length 个字符。如果没有指定 length,那么返回的字符串包含从 start 到 stringObject 的结尾的字符。
二者区别:
- substring(start,end)返回指定下标间的字符,下标必须为正整数
- substr(start,length)返回从指定下标开始的长度为length的字符,可以为负数
扫一扫 下方二维码,关注我的公众号【前端名狮】,更多精彩内容陪伴你!