# Heading
Tags: algorithms amazon bloomberg microsoft string dynamic-programming
Langs: c cpp csharp dart elixir erlang golang java javascript kotlin php python python3 racket ruby rust scala swift typescript
- algorithms
- Medium (38.11%)
- Likes: 7101
- Dislikes: -
- Total Accepted: 1.6M
- Total Submissions: 4.3M
- Testcase Example: '"babad"'
给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
/*
* @lc app=leetcode.cn id=5 lang=javascript
*
* [5] 最长回文子串
* 中心扩散
*/
// @lc code=start
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
if (s.length < 2) {
return s
}
// 以start和end为中心,计算最大回文串的长度
const maxPalindromeLength = (str, start, end) => {
while (start >= 0 && end < str.length && str[start] === str[end]) {
start--
end++
}
return end - start + 1 - 2
}
let begin = 0
let maxLength = 0
for (let i = 0; i < s.length; i++) {
// 奇数和偶数分别讨论
const oddMax = maxPalindromeLength(s, i, i)
const evenMax = maxPalindromeLength(s, i, i + 1)
const curMaxLength = Math.max(oddMax, evenMax)
if (curMaxLength > maxLength) {
maxLength = curMaxLength
begin = i - Math.floor((curMaxLength - 1) / 2)
}
}
return s.slice(begin, begin + maxLength)
}
// @lc code=end
// @after-stub-for-debug-begin
module.exports = longestPalindrome
// @after-stub-for-debug-end
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
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
/*
* @lc app=leetcode.cn id=5 lang=javascript
*
* [5] 最长回文子串
* 动态规划
*/
// @lc code=start
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
if (s.length < 2) {
return s
}
let begin = 0
let maxLength = 0
// dp[i][j] 代表下标从i到j是一个回文串
// dp[i][j] = s[i] === s[j] && dp[i+1][j-1]
const dp = []
for (let i = 0; i < s.length; i++) {
if (dp[i] === undefined) {
dp[i] = []
}
dp[i][i] = true
}
for (let j = 1; j < s.length; j++) {
for (let i = 0; i <= j; i++) {
if (s[i] !== s[j]) {
dp[i][j] = false
} else if (j - i < 3) {
// 字符串是两位或者三位
dp[i][j] = true
} else {
dp[i][j] = dp[i + 1][j - 1]
}
if (dp[i][j] && j - i + 1 > maxLength) {
maxLength = j - i + 1
begin = i
}
}
}
return s.slice(begin, begin + maxLength)
}
// @lc code=end
// @after-stub-for-debug-begin
module.exports = longestPalindrome
// @after-stub-for-debug-end
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
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