-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path3-lengthOfLongestSubstring.js
More file actions
54 lines (51 loc) · 1.6 KB
/
3-lengthOfLongestSubstring.js
File metadata and controls
54 lines (51 loc) · 1.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
* @param {string} s
* @return {number}
*/
// 1. 暴力算法
var lengthOfLongestSubstring = function(s) {
var arr = s.split('');
var cacheMap = {};
var length = 0;
arr.forEach((char, i) => {
cacheMap[char] = true;
for (let index = i+1; index < arr.length; index++) {
const nextChar = arr[index];
// 存在重复, 从下一位开始找
if (cacheMap[nextChar]) {
// 从已有结果和上一次最大结果中取最大
length = Math.max(length, Object.keys(cacheMap).length);
cacheMap = {};
return;
} else {
cacheMap[nextChar] = true;
}
}
// 同理,取最大,这里只是找到最后都没有重复出现的特殊情况
length = Math.max(length, Object.keys(cacheMap).length);
});
return length;
};
// 2. 滑动窗口(不回溯)
var lengthOfLongestSubstring = function(s) {
var arr = s.split('');
if (arr.length === 0) return 0;
var window = [arr[0]];
var length = 1;
arr.forEach((char, i) => {
if (i === 0) return;
if (window.indexOf(char) !== -1) {
length = Math.max(length, window.length);
// 出现重复,可以从左清理窗口
while(window.indexOf(char) !== -1) {
window.shift();
}
}
window.push(char);
});
// 覆盖找到最后都没有重复出现的特殊情况
length = Math.max(length, window.length);
return length;
}
var s = '';
console.log(lengthOfLongestSubstring(s));