题目描述
C++解法
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int size,i=0,j,k,max=0;
size=s.size();
for(j=0;j<size;j++){
for(k=i;k<j;k++)
if(s[k]==s[j]){
i=k+1;
break;
}
if(j-i+1>max)
max=j-i+1;
}
return max;
}
};
python3解法
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
i,j,ans=0,0,0
while(j<len(s)):
if(s[j] not in s[i:j]):
ans=max(ans,j+1-i)
j=j+1
else:
i=i+1
return ans;
javascript解法
var lengthOfLongestSubstring = function(s) {
const mapper = {}; // 记录已经出现过的charactor
let res = 0;
let slidingWindow = [];
for (let c of s) {
if (mapper[c]) {
// 已经出现过了
// 则删除
const delIndex = slidingWindow.findIndex(_c => _c === c);
for (let i = 0 ; i < delIndex; i++) {
mapper[slidingWindow[i]] = false;
}
slidingWindow = slidingWindow.slice(delIndex + 1).concat(c);
} else {
// 新字符
if (slidingWindow.push(c) > res) {
res = slidingWindow.length;
}
}
mapper[c] = true;
}
return res;
};
思路:用一个hashmap来建立字符和其出现位置之间的映射。
维护一个滑动窗口,窗口内的都是没有重复的字符,去尽可能的扩大窗口的大小,窗口不停的向右滑动。
(1)如果当前遍历到的字符从未出现过,那么直接扩大右边界;
(2)如果当前遍历到的字符出现过,则缩小窗口(左边索引向右移动),然后继续观察当前遍历到的字符;
(3)重复(1)(2),直到左边索引无法再移动;
(4)维护一个结果res,每次用出现过的窗口大小来更新结果res,最后返回res获取结果。
关键点:
- 用一个mapper记录出现过并且没有被删除的字符
- 用一个滑动窗口记录当前index开始的最大的不重复的字符序列
- 用res去记录目前位置最大的长度,每次滑动窗口更新就去决定是否需要更新res