/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
var n = 0;//记录最长子串长度
var x = 0;//当前入口
for (;x < s.length;x++){
var a = {};
for (var t = 0; ! a[s[x+t]] && (x+t)<s.length;){
a[s[x+t]] = s[x+t];
t++;
n = (t < n)?n:t;
}
}
return n;
};
第一版写完后发现太拉了,看了答案思路后发现已经判断过的窗口不需要再重复进行判断,进行了微小的优化。
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
var n = 0;//记录最长子串长度
var x = 0;//当前入口
var t = 0;//当前窗口长度
var a ={};//记录当前窗口内存在字符
for (;x < s.length;x++){
//var a = {};
for (; ! a[s[x+t]] && (x+t)<s.length;){
a[s[x+t]] = s[x+t];
t++;
n = (t < n)?n:t;
}
t--;//窗口入口前移,窗口大小减小
delete a[s[x]];//窗口入口前移,移除窗口内的第一个元素(由于之前的判断,窗口内剩下的元素一定都是不重复的)
}
return n;
};