-
Notifications
You must be signed in to change notification settings - Fork 229
/
Copy path1542-find-longest-awesome-substring.js
75 lines (66 loc) · 1.48 KB
/
1542-find-longest-awesome-substring.js
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
* @param {string} s
* @return {number}
*/
const longestAwesome = function(s) {
const n = s.length, map = new Map(), {max} = Math
let res = 0, mask = 0
map.set(0, -1)
for(let i = 0; i < n; i++) {
const d = +s[i]
mask ^= (1 << d)
if(map.has(mask)) {
res = max(res, i - map.get(mask))
}
for(let j = 0; j < 10; j++) {
const tmp = mask ^ (1 << j)
if(map.has(tmp)) {
// console.log(i, map.get(tmp), tmp)
res = max(res, i - map.get(tmp))
}
}
if(!map.has(mask)) {
map.set(mask, i)
}
}
return res
};
// another
/**
* @param {string} s
* @return {number}
*/
const longestAwesome = function (s) {
const dp = new Array(1024).fill(s.length)
let res = 0,
mask = 0
dp[0] = -1
for (let i = 0; i < s.length; ++i) {
mask ^= 1 << +s.charAt(i)
res = Math.max(res, i - dp[mask])
for (let j = 0; j <= 9; ++j) res = Math.max(res, i - dp[mask ^ (1 << j)])
dp[mask] = Math.min(dp[mask], i)
}
return res
}
// another
/**
* @param {string} s
* @return {number}
*/
const longestAwesome = function(s) {
const n = s.length, { max, min } = Math
const dp = Array(2 ** 10).fill(n)
let res = 0, mask = 0
dp[0] = -1
for(let i = 0; i < n; i++) {
mask ^= (1 << parseInt(s[i]))
res = max(res, i - dp[mask])
for(let j = 0; j <= 9; j++) {
const tmp = mask ^ (1 << j)
res = max(res, i - dp[tmp])
}
dp[mask] = min(i, dp[mask])
}
return res
};