这道题的关键在于我们如何找出那个最长的字符串,我们可以选择维护一个不重复的子串,我们把它称之为一个窗口,这个窗口的左端位置我们用j来表示,右端我们用i来表示,那么这个窗口的长度应该是i-j+1。
我们设置一个map,并且遍历字符串,如果map当中有这个值说明重复了,所以我们需要把左端的值更新一下,更新成为上一次出现的值的右边那一位,这是什么意思了,我们举个例子:
abca
,当我们走到c时,当前的窗口应该是abc,走到第二个a时,我们就应该更新窗口的左端来使窗口中没有重复值,窗口的左端应该是map中a的位置再向前移动一位。
var lengthOfLongestSubstring = function(s) {
let curr = 0;
let valuePos = new Map();
const len = s.length;
if(len==0)
{
return 0;
}
for(let i=0,j=0;i<len;i++)
{
if(valuePos.has(s[i])){
j = Math.max(j,valuePos.get(s[i])+1);
}
valuePos.set(s[i],i);
curr = Math.max(curr,i-j+1);
}
return curr;
};
discuss中的方法
function lengthOfLongestSubstring(s) {
const map = {};
var left = 0;
return s.split('').reduce((max, v, i) => {
left = map[v] >= left ? map[v] + 1 : left;
map[v] = i;
return Math.max(max, i - left + 1);
}, 0);
}