1
/**
2
* @param {string} S
3
* @return {string}
4
*/
5
var makeLargestSpecial = function (S) {
6
let t = S;
7
while (true) {
8
let t1 = largest(t);
9
if (t1 == t) return t;
10
t = t1;
11
}
12
function largest(S) {
13
let arr = S.split("").map((x) => Number.parseInt(x)),
14
num = Number.parseInt(S, 2),
15
rtn = S;
16
for (let firstEndIndex = 1; firstEndIndex < S.length - 2; firstEndIndex++) {
17
for (let lLength = 2; lLength < firstEndIndex + 2; lLength += 2) {
18
let firstStartIndex = firstEndIndex - lLength + 1;
19
if (!isSpecial(firstStartIndex, firstEndIndex)) continue;
20
for (
21
let rLength = 2;
22
rLength < S.length - firstEndIndex;
23
rLength += 2
24
) {
25
let secondStartIndex = firstEndIndex + 1,
26
secondEndIndex = firstEndIndex + rLength;
27
if (!isSpecial(secondStartIndex, secondEndIndex)) continue;
28
let str = [
29
...arr.slice(0, firstStartIndex),
30
...arr.slice(secondStartIndex, secondEndIndex + 1),
31
...arr.slice(firstStartIndex, firstEndIndex + 1),
32
...arr.slice(secondEndIndex + 1),
33
].join("");
34
let newNum = Number.parseInt(str, 2);
35
if (newNum > num) {
36
num = newNum;
37
rtn = str;
38
}
39
}
40
}
41
}
42
return rtn;
43

44
function isSpecial(start, end) {
45
let t = 0;
46
for (let i = start; i <= end; i++) {
47
t += arr[i] == 1 ? 1 : -1;
48
if (t < 0) return false; // this is the second rule, really bad description
49
}
50
return t == 0 ? true : false;
51
}
52
}
53
};
54

55
// console.log(makeLargestSpecial("101101011000"))

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0