Eighteen Blog

题目说明

1
2
3
4
5
6
7
8
9
10
11
12

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

解题思路一

  1. 遍历字符串,从i开始向左右扩展对比 i--, i++ 是否相同,过程求出最大值。
  2. 以上仅检测奇数回文即:"cbabc"而不能检测cbbc
  3. 对原字符串进行改造例如"cbbc" => "c#b#b#c"这样就可以以#为中心对比了。(奇数长度例如"cbabc" => c#b#a#b#c并不会被#影响,所以不用担心破坏了对比结构。)
  4. 对比过程中要注意不要让#b#b#b这样的情况给顶替了。相同长度时要取末尾为字母的。

代码实现一

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
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
s = s.split('').join('#');
let max = 0;
let start = 0;
let end = 0;
for (let i = 0; i < s.length; i++) {
let left = i - 1;
let right = i + 1;
while(left >= 0 && right < s.length) {
if (s.charAt(left) === s.charAt(right)) {
if (max < (right - left) && s.charAt(right) !== '#') {
max = right - left;
start = left;
end = right;
}
right++;
left--;
} else {
break;
}
}
}
return s.slice(start, end + 1).split('#').join('')
};

 评论