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]


                
相关推荐
8Qi81 小时前
LeetCode 213:打家劫舍 II(House Robber II)—— 题解 ✅
算法·leetcode·职场和发展·动态规划
Lsk_Smion2 小时前
力扣实训 _ [75].颜色分类 _ 杨辉三角
数据结构·算法·leetcode
8Qi84 小时前
LeetCode 1049:最后一块石头的重量 II —— 题解 ✅
算法·leetcode·职场和发展·动态规划·01背包
运筹vivo@7 小时前
LeetCode 2574. 左右元素和的差值
算法·leetcode·职场和发展·每日一题
一只齐刘海的猫8 小时前
【Leetcode】移动零
算法·leetcode·职场和发展
人道领域8 小时前
【LeetCode刷题日记】131.分割回文串,动态规划优化
java·开发语言·leetcode
Lsk_Smion10 小时前
力扣实训 _ [994].腐烂的橘子/图论
算法·leetcode·图论
8Qi811 小时前
LeetCode 337:打家劫舍 III(House Robber III)—— 题解 ✅
算法·leetcode·二叉树·动态规划
2601_9611940211 小时前
教资科三美术考什么|初中高中美术题型考点和模板资料
leetcode·elasticsearch·职场和发展·蓝桥杯·pat考试·lucene
8Qi812 小时前
LeetCode 121 & 122:股票买卖问题(DP 对比题解)✅
算法·leetcode·职场和发展·动态规划