5.最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
本题的考点为中心扩散算法,即对于字符串,同时做中心扩散为单或复数的处理。这么说起来可能有些复杂,举个栗子。
我们有个字符串,abcba 此时中心为 c,若我们还有个字符串 abccba,那么中心应该为 cc向两侧扩散。这个方法有点类似于寻找数组中的3数相加等于目标数的问题。
话不多说,上代码。
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
const length = s.length
let start = 0, end = 0
if(!s.length || s === undefined) {
return ''
}
for(let i = 0; i < length; i++) {
let len1 = getMaxMidwordsLength(s, i, i)//判断中心为单数向两边扩散
let len2 = getMaxMidwordsLength(s, i, i + 1)//判断中心为双数向两边扩散
let len = Math.max(len1, len2)
if(len > end - start) {
start = i - parseInt((len - 1) / 2)
end = i + parseInt(len / 2)
}
}
return s.substring(start, end + 1)
function getMaxMidwordsLength (words, start, end) {
while (start >= 0 && end < words.length && words.charAt(start) === words.charAt(end)) {
start--
end++
}
return end - start - 1
}
}
一个for循环内调用两次while循环。条件输入单数开始和复数中心开始。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。