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]


                
相关推荐
一起努力啊~1 小时前
算法题打卡力扣第1658题:将 x 减到 0 的最小操作数(mid)
学习·leetcode
Cccp.1232 小时前
【leetcode】(六) 图和贪心算法
数据结构·算法·leetcode
y1su2 小时前
【Leetcode】1477. 找两个和为目标值且不重叠的子数组
数据结构·后端·算法·leetcode·职场和发展
mmmmath_313 小时前
LeetCode.541.反转字符串II
数据结构·算法·leetcode
Navigator_Z13 小时前
LeetCode //MySQL - 1251. Average Selling Price
c语言·算法·leetcode
参.商.15 小时前
【Day 53】76. 最小覆盖子串
leetcode·golang
虚无的纽扣17 小时前
【力扣刷题】第二天:无重复字符的最长字串、移动零问题
算法·leetcode·排序算法
圣保罗的大教堂20 小时前
leetcode 3742. 网格中得分最大的路径 中等
leetcode
我不会起名字3221 天前
一天一道算法题(35):电话号码的字母组合
java·数据结构·后端·python·leetcode·go·回溯
圣保罗的大教堂1 天前
leetcode 2033. 获取单值网格的最小操作数 中等
leetcode