滑动窗口
1、遍历整个字符串,通过一个临时集合存入遍历中的子串。
2、通过判断遍历时的元素是否子串内,判断子串是否结束。
3、若子串在遍历中结束,则与最长的长度比较,获取最长子串的长度。
4、若子串在遍历中一直未结束,则整个字符串无重复,字符串长度就是最长子串长度。
1、使用字符串类型存储比数组省内存,拼接也会更快
var lengthOfLongestSubstring = function(s) {
let list = [];
/* code */
};
var lengthOfLongestSubstring = function(s) {
let str = "";
/* code */
};
2、使用数字类型记录遍历遍历的长度,减少对值长度的引用
var lengthOfLongestSubstring = function(s) {
let str = "";
let maxLength = 0;
const sLength = s.length;
/* 放在外部,只取一次,避免遍历时反复取 */
for (let i = 0; i < sLength; i++) {
/* for 循环在遍历时会反复的执行第二段参数 */
/* code */
}
/* code */
};
1、字符串取下标与字符串的 charAt 方法,哪个更快?
var lengthOfLongestSubstring = function(s) {
/* code */
for (let i = 0; i < sLength; i++) {
/* code */
// const item = s[i];
const item = s.charAt(i);
/* code */
}
/* code */
};
2、字符串的 substr 和 slice 哪个更快?
var lengthOfLongestSubstring = function(s) {
let str = "";
let maxLength = 0;
const sLength = s.length;
for (let i = 0; i < sLength; i++) {
const strLen = str.length;
const item = s.charAt(i);
const index = str.indexOf(item);
/* code */
// str = str.substr(index + 1);
str = str.slice(index + 1);
/* code */
}
return str.length > maxLength ? str.length : maxLength;
};