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]


                
相关推荐
踩坑记录2 小时前
leetcode hot100 1143. 最长公共子序列 mediuim 递归优化
leetcode
无限进步_2 小时前
【C++】寻找数组中出现次数超过一半的数字:三种解法深度剖析
开发语言·c++·git·算法·leetcode·github·visual studio
人道领域2 小时前
【LeetCode刷题日记】150.逆波兰表达式求值
java·数据结构·算法·leetcode
踩坑记录2 小时前
leetcode hot100 136. 只出现一次的数字 easy 技巧 位运算 异或 XOR(^)
leetcode
6Hzlia14 小时前
【Hot 100 刷题计划】 LeetCode 199. 二叉树的右视图 | C++ DFS 逆序遍历
c++·leetcode·深度优先
踩坑记录16 小时前
leetcode hot100 118. 杨辉三角 easy 动态规划
leetcode·动态规划
木井巳17 小时前
【递归算法】解数独
java·算法·leetcode·决策树·深度优先·剪枝
上弦月-编程17 小时前
企业级RAG系统构建指南
leetcode
阿Y加油吧17 小时前
算法实战笔记:LeetCode 31 下一个排列 & 287 寻找重复数
笔记·算法·leetcode