leetcode每日一题 - 5. 最长回文子串
题目解释
最长的回文子串,举个例子:abba, 如果这个abba正着读和倒着读都一样,就说明该字符串的最大回文子串为abba。
题解
1、需要两个变量,
记录回文字符串的起始位置(start)一个记录回文字符串的最大长度(maxLength)2、创建一个函数(满足以下三个条件)- 1、判断左边和右边是否越界,同时最左边的字符是否等于最右边的字符
- 2、如果以上3个条件都满足,则判断是否需要更新回文字符串最大长度及最大字符串的起始位置,然后left--,right++,继续判断,直到不满足三个条件之一
贴出代码
function longestPalindrome(s: string): string {
// 如果字符串小于2,直接返回原字符串
if (s.length < 2) {
return s
}
let start: number = 0 //回文字符串的起始位置
let maxLength: number = 1 //这里为什么不设置初始化为0呢?可以想像参数s如果为ab,那返回的最大长度应该是1,而不是0.所以maxlength初始值应该为1
// 创建函数(三个条件)
// 1、判断左边和右边是否越界,
// 2、同时最左边的字符是否等于最右边的字符
// 3、如果以上3个条件都满足,则判断是否需要更新回文字符串最大长度及最大字符串的起始位置,然后left--,right++,继续判断,直到不满足三个条件之一
function expendAroundCenter(left: number, right: number) {
while (left >= 0 && right < s.length && s[left] === s[right]) {
//索引 + 1
if (right - left + 1 > maxLength) {
maxLength = right - left + 1
start = left
}
left--
right++
}
}
// 对s的每个值进行循环遍历
for (let i: number = 0; i < s.length; i++) {
//有两种情况,(单数和双数)例如aba,abab
expendAroundCenter(i - 1, i + 1)
expendAroundCenter(i, i + 1)
}
return s.substring(start, start + maxLength)
}
console.log(longestPalindrome(s))