面试题目(字节跳动)
给定一个字符串,找出其中无重复字符的最长子字符串长度
示例:
给定 "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的字符,可以为负数