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]


                
相关推荐
闪电悠米16 小时前
力扣hot100-73.矩阵置零-标记数组详解
算法·leetcode·矩阵
过期动态19 小时前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
Adios7941 天前
设置交集大小至少为2
数据结构·算法·leetcode
程序猿乐锅1 天前
【数据结构与算法 | 第六篇】力扣1109,1094差分数组
java·算法·leetcode
hold?fish:palm2 天前
9 找到字符串中所有字母异位词
c++·算法·leetcode
Sw1zzle2 天前
算法入门(六):贪心算法 - 基础入门(Leetcode 121/455/860/376/738)
算法·leetcode·贪心算法
青山木2 天前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
啦啦啦啦啦zzzz2 天前
算法:回溯算法
c++·算法·leetcode
小肝一下2 天前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
tachibana22 天前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode