给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
1 <= s.length <= 1000
s 仅由数字和英文字母组成
思路
- 回文串有两种情况,偶数长度或奇数长度,分别对应居中字符重复与否,类似 aba、abba
- 可在所有字符周边插入一个特殊的辅助字符,使情况统一化(回文串恒为奇数长度),如 #a#b#a#、#a#b#b#a#
- 回文字符串恒为奇数长度的情况下,边界情况的处理较容易些
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| var longestPalindrome = function (s) { const str = '#' + s.split('').join('#') + '#' let result = 0 let startIndex = 0 for (let i = 1; i < str.length; ++i) { let length = 1 for (let j = 1; j <= i && i + j < str.length; ++j) { if (str[i - j] !== str[i + j]) { break } length += 2 } if (length > result) { result = length startIndex = i - (length - 1) / 2 } } return str.substring(startIndex, startIndex + result).replace(/#/g, '') }
|