leetcode hot100 5. 最长回文子串 中心扩展法 medium


回文的特点: 左右对称

所以可以:以每个位置为中心,向两边扩展,看看能扩多长

回文有两种:

python 复制代码
//奇数长度(aba):中心是一个字符
   中心
    ↓
    a
   / \
  b   b
 

// 偶数长度(abba):中心是两个字符
   中心
    ↓
   b b
  /   \
 a     a

举个例子

遍历过程:

i=0 → "b"

i=1 → "bab" ✅

i=2 → "aba" ✅

i=3 → "a"

i=4 → "d"

👉 最终结果:"bab" 或 "aba"

时间:O(n²)

空间:O(1)

python 复制代码
class Solution:
    def longestPalindrome(self, s: str) -> str:  #时间:O(n²), 空间:O(1)
        start = 0
        max_len = 1

        # 辅助函数,左右相等时,循环往外扩展
        def expand(left, right):  # 以left/right为中心点(可能left=right)
            while left >= 0 and right < len(s) and s[left] == s[right]:
                left -= 1
                right += 1

            return right - left - 1  # 跳出循环时,回文长度

        for i in range(len(s)):
            len1 = expand(i, i)      # 奇数长度回文,中心点只有一个left=right
            len2 = expand(i, i + 1)  # 偶数长度回文,中心点只有2个left,left+1

            curr_max = max(len1, len2)  ## 取更长的

            # 更新最长回文
            if curr_max > max_len: 
                max_len = curr_max

                # 计算这个回文的起点 start
                # 举例:i=2, len=3 (aba) -> start = 2 - (3-1)//2 = 1
                # 举例:i=2, len=4 (abba) -> start = 2 - (4-1)//2 = 1
                start = i - (curr_max - 1) // 2

        return s[start : start + max_len]


                
相关推荐
To_OC1 天前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
To_OC1 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC2 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
To_OC4 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
To_OC5 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
想吃火锅100511 天前
【leetcode】121.买卖股票的最佳时机js/c++
算法·leetcode·职场和发展
凌波粒11 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
退休倒计时11 天前
【每日一题】LeetCode 146. LRU 缓存 TypeScript
算法·leetcode·缓存·typescript
小欣加油11 天前
leetcode3612 用特殊操作处理字符串I
数据结构·c++·算法·leetcode·职场和发展
凌波粒12 天前
LeetCode--90.子集II(回溯算法)
数据结构·算法·leetcode