Skip to content

Commit 6aa720b

Browse files
committed
create 2002 in js,ts
1 parent 4f9f2e1 commit 6aa720b

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/**
2+
* @param {string} s
3+
* @return {number}
4+
* Time Complexity: O(2^N)
5+
* Space Complexity: O(2^N)
6+
*/
7+
var maxProduct = function (s) {
8+
const N = s.length;
9+
const first = new Array(1 << N).fill(0),
10+
last = new Array(1 << N).fill(0);
11+
for (let i = 0; i < N; i++) {
12+
for (let j = 1 << i; j < 1 << (i + 1); j++) {
13+
first[j] = i;
14+
}
15+
}
16+
for (let i = 0; i < N; i++) {
17+
for (let j = 1 << i; j < 1 << N; j += 1 << (i + 1)) {
18+
last[j] = i;
19+
}
20+
}
21+
const dp = Memo((m) => {
22+
if ((m & (m - 1)) === 0) {
23+
return m != 0;
24+
}
25+
const l = last[m],
26+
f = first[m];
27+
const lb = 1 << l,
28+
fb = 1 << f;
29+
return Math.max(
30+
dp(m - lb),
31+
dp(m - fb),
32+
dp(m - lb - fb) + (s[l] == s[f]) * 2
33+
);
34+
});
35+
let ans = 0;
36+
for (let m = 1; m < 1 << N; m++) {
37+
ans = Math.max(ans, dp(m) * dp((1 << N) - 1 - m));
38+
}
39+
return ans;
40+
};
41+
42+
var Memo = (func) => {
43+
const map = new Map();
44+
var wrapper = (m) => {
45+
if (!map.get(m)) {
46+
map.set(m, func(m));
47+
}
48+
return map.get(m);
49+
};
50+
return wrapper;
51+
};
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* Time Complexity: O(2^N)
3+
* Space Complexity: O(2^N)
4+
*/
5+
function maxProduct(s: string): number {
6+
const N = s.length;
7+
const first: number[] = new Array(1 << N).fill(0),
8+
last: number[] = new Array(1 << N).fill(0);
9+
for (let i = 0; i < N; i++) {
10+
for (let j = 1 << i; j < 1 << (i + 1); j++) {
11+
first[j] = i;
12+
}
13+
}
14+
for (let i = 0; i < N; i++) {
15+
for (let j = 1 << i; j < 1 << N; j += 1 << (i + 1)) {
16+
last[j] = i;
17+
}
18+
}
19+
const dp = cache((m: number) => {
20+
if ((m & (m - 1)) === 0) {
21+
return m != 0;
22+
}
23+
const l = last[m], f = first[m];
24+
const lb = 1 << l, fb = 1 << f;
25+
return Math.max(
26+
dp(m - lb),
27+
dp(m - fb),
28+
dp(m - lb - fb) + Number(s[l] === s[f]) * 2
29+
);
30+
});
31+
let ans = 0;
32+
for (let m = 1; m < 1 << N; m++) {
33+
ans = Math.max(ans, dp(m) * dp((1 << N) - 1 - m));
34+
}
35+
return ans;
36+
};
37+
38+
function cache(func:Function){
39+
const map = new Map();
40+
var wrapper = (m:number) => {
41+
if (!map.get(m)) {
42+
map.set(m, func(m));
43+
}
44+
return map.get(m);
45+
};
46+
return wrapper;
47+
};

0 commit comments

Comments
 (0)