一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 2 天,点击查看活动详情。
最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000s仅由数字和英文字母组成
思路分析
方法一
- 最简单最粗暴的方式,找出字符串
s中所有的回文子串,然后寻找最长的那个即可; - 定义一个辅助方法
help,来判断一个字符串是不是回文子串,判断一个字符串是否为回文子串的方法,只需要判断一个字符串中第i项跟第len-i-1项是否相同即可。 - 两次遍历字符串,判断组成的字符串中是回文子串的并且长度最长的,返回即可。
方法二
- 使用中心扩展,遍历数组,找到连续一样的字符串,然后左右扩展,直到左右两侧不一致为止;
- 定义当前最大回文串的长度以及当前最大的回文串,以当前遍历的这个字符为中心,左右两侧遍历,找到当前字符后连接的所有一样的字符,更新
i的指针和str即可。
AC 代码
方法一
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
let res = ""
let max = 0
let len = s.length
for (let i = 0; i < len; i++)
for (let j = i + 1; j <= len; j++) {
const str = s.substring(i, j)
if (help(str) && str.length > max) {
res = s.substring(i, j)
max = Math.max(max, res.length)
}
}
return res
};
var help = function (s) {
const len = s.length
for (let i = 0; i < len / 2; i++) {
if (s.charAt(i) != s.charAt(len - i - 1)) {
return false
}
}
return true
}
结果:
- 执行结果: 通过
- 执行用时:5232 ms, 在所有 JavaScript 提交中击败了5.00%的用户
- 内存消耗:47.3 MB, 在所有 JavaScript 提交中击败了35.18%的用户
- 通过测试用例:180 / 180
方法二
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
let maxLen = 0
let res = ''
for (let i = 0; i < s.length; i++) {
let str = s[i]
let left = i - 1
while (s[i + 1] === s[i]) {
str += s[i]
i++
}
let right = i + 1
while (s[left] === s[right] && s[left] !== undefined) {
str = s[left] + str + s[left]
left--
right++
}
if (str.length > maxLen) {
maxLen = str.length
res = str
}
}
return res
}
结果:
- 执行结果: 通过
- 执行用时:72 ms, 在所有 JavaScript 提交中击败了97.75%的用户
- 内存消耗:48.8 MB, 在所有 JavaScript 提交中击败了28.75%的用户
- 通过测试用例:180 / 180