跳转至 最长回文子串https://leetcode-cn.com/problems/longest-palindromic-substring/
题目
给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
示例 3:
输入:s = "a"
输出:"a"
示例 4:
输入:s = "ac"
输出:"a"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
题解
回文串指的是一个字符串的左边等于右边,比如 'aba'、'bb' 是回文串, 而 'dab' 则不是。
思路:
对给定字符串进行遍历,每次遍历都以遍历到的下标进行中心扩散,看看扩散到的左边与右边字符是否相等,如果相等即为回文串,否则不是。
值得注意的是,每次遍历都执行了两次中心扩散,这是因为需要处理两种情况 'aba' 和 'bb'。
function longestPalindrome(s: string): string {
if(s.length === 1) return s
let maxPalindromeStr: string = ''
for(let i = 0; i < s.length; ++i) {
diffusionSearch(i, i)
diffusionSearch(i, i + 1)
}
function diffusionSearch(left: number, right: number): void {
while(left >= 0 && right < s.length && s[left] === s[right]) {
left--
right++
}
maxPalindromeStr = right - left - 1 > maxPalindromeStr.length ?
s.substring(left + 1, right) :
maxPalindromeStr
}
return maxPalindromeStr
};
执行效率如下: