原题链接:leetcode5
题目描述:从字符串s中找到最长的回文子串,并返回这个子串
思路:
两种情况
一种是回文子串长度为奇数(如aba,中心是b)
另一种回文子串长度为偶数(如abba,中心是b,b)
循环遍历字符串 对取到的每个值 都假设他可能成为最后的中心进行判断
遍历字符串s,以当前元素为回文的中间元素往两边找,找的过程中分两种情况假设子串是偶数的时候 找以当前元素和下一个元素为中间往两边;假设是奇数时候 找以当前元素为中间的两边,直到字符串s遍历结束
/**
* 遍历:总是以当前这个元素为回文的中间元素,往两边找
* @param {string} s
* @return {string}
*/
var longestPalindrome = function (s) {
// 边界条件
let len = s.length
if (len < 2) return s
let res = ''
let getPalindrome = (left, right) => {
while (left >= 0 && right < len && s[left] === s[right]) {
left--
right++
}
// 当left和right不相等的时候跳出循环,所以回文子串的位置为left+1 ,和right-1中间的字符
if (right - left - 1 > res.length) { //注意点: 取长度的时候是right-1 和left+1 之间的长度
res = s.slice(left + 1, right)//slice取值左闭右开
}
}
for (let i = 0; i < len; i++) {
//回文长度是奇数
getPalindrome(i, i)
//回文长度是偶数
getPalindrome(i, i + 1)
}
return res
};
let s = 'asvvs'
s = "cbbd"
console.log(longestPalindrome(s))
小知识点: 数组和字符串的slice使用 s.slice(left,right) 取字符串s的从left到right-1位置上的元素,位置从0开始。参数可以取负值 -1代表最后一个元素(也就是从后往前遍历时候的第一个元素),-2代表倒数第二个元素