-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path5-Longest-Palindromic-Substring.js
47 lines (44 loc) · 1.16 KB
/
5-Longest-Palindromic-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
/**
* @param {string} s
* @return {string}
*/
/**
* 說明
* 假設題目 "abcba"
* P[left][right] 是指 left 到 right 為迴文
*
* P[0][0] = true
* P[0][1] = s[0] === s[1]
* P[0][2] = s[0] === s[2] && P[0][1]
* ...
* P[1][0] = not exist
* ...
* P[1][4] = s[1] === s[4] && P[2][3]
*
* 以此類推
*
* 回文需要符合
* 1. s[left] === s[right]
* 2. P[left+1] === P[right-1] 或 left + 1 >= right -1 ([0][0], [0][1] 只要檢查值是否一樣)
*/
var longestPalindrome = function(s) {
const len = s.length,
isPalindromic = [...Array(len)].map((x) => Array(len).fill(false));
let start = 0,
max = 1;
for (let right = 1; right < len; right++) {
for (let left = right - 1; left >= 0; left--) {
if (
(left + 1 >= right - 1 || isPalindromic[left + 1][right - 1]) &&
s.substr(left, 1) === s.substr(right, 1)
) {
isPalindromic[left][right] = true;
if (right - left + 1 > max) {
max = right - left + 1;
start = left;
}
}
}
}
return s.substr(start, max);
};