-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patho_solution.js
60 lines (48 loc) · 1.39 KB
/
o_solution.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
/**
* @param {string} s
* @return {string}
*/
const longestPalindrome = (s) => {
let newString = reformat(s),
P = Array(newString.length).fill(0),
center = 0,
rightBoundry = 0;
for (let i = 0; i < newString.length; i++) {
let mirrorIndex = center - (i - center);
// console.log("mirrorIndex: " + mirrorIndex)
if (i < rightBoundry) {
P[i] = Math.min(rightBoundry - i, P[mirrorIndex])
console.log(newString[i])
console.log(`i < rightBoundry - P[${i}]: ` + P[i])
}
let left = i - (P[i] + 1);
let right = i + (P[i] + 1);
console.log(`P[i]: ${P[i] + 1}, left: ${left}, right: ${right}`)
while (right < newString.length && left >= 0 && newString[left] === newString[right]) {
P[i]++;
left--;
right++;
}
if (i + P[i] > rightBoundry) {
center = i;
rightBoundry = i + P[i];
}
}
// console.log(Math.max(...P))
// console.log(P.indexOf())
let
max_length = Math.max(...P),
loc = P.indexOf(Math.max(...P));
// console.log(newString.substring((loc - max_length), (loc + max_length)).split("#").join(""))
return newString.substring((loc - max_length), (loc + max_length)).split("#").join("");
};
const reformat = (s) => {
s = s.split('');
let rs = "";
for (let i = 0; i < s.length; i++) {
rs += `#${s[i]}`;
}
return `${rs}#`;
}
// longestPalindrome("abbc")
longestPalindrome("NBNNBR")