要解决的问题?
"abcabcbb" => 3 //无重复字符的最长子串是 "abc",长度为 3。
"abcabcbb" => 1 //无重复字符的最长子串是 "b",长度为 1。
"pwwkew" => 3 //无重复字符的最长子串是 "wke",长度为 3。
思路
转换字符串为字符数组C
创建空数组A用于存放从数组C中截取的非重复字符串
创建变量L用于存储较长字符串长度。
遍历字符数组C,根据当前遍历字符是否存在于数组A中,对数组A进行操作
如果存在 为保障数组A不包含数组C中截取的非重复字符串,需要截取重复字符之后的所有字符串重新赋值数组A,并将当前遍历字符压入,此操作压入一个字符删除至少一个字符所以操作后数组A的长度将小于等于上一次操作后数组A的长度,故L将维持上一次操作后数组A的长度不变。
如果不存在 则表明数组A中不存在当前遍历字符,可将当前字符压入,此操作看似数组A的长度将大于变量L,但存在上次遍历字符为重复字符,则变量L为上上次操作后数组A的长度,所以需要比较当前数组A长度和变量L大小,将较大者赋值给变量L,
经过上诉操作后变量L将保存字符数组C中的最长非重复字符串长度
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
const strs = s.split(""), LongestArr = [];
let LALength = 0;
strs.map(str => {
let LAIndex = LongestArr.indexOf(str);
if (LAIndex < 0) {
LongestArr.push(str);
LALength = LongestArr.length > LALength ? LongestArr.length : LALength;
} else {
LongestArr.splice(0, LAIndex + 1);
LongestArr.push(str);
}
return 0;
});
return LALength
};