首页 > 编程语言 >LeetCode算法笔记5

LeetCode算法笔记5

时间:2024-07-15 22:27:00浏览次数:12  
标签:子串 right end 笔记 start 算法 left LeetCode 回文

题目描述

给你一个字符串 s,找到 s 中最长的 回文子串

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:
  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

解法:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        if len(s) < 2:
            return s
        
        start, end = 0, 0
        
        def expand_around_center(left, right):
            nonlocal start, end
            while left >= 0 and right < len(s) and s[left] == s[right]:
                left -= 1
                right += 1
            # 注意:此时s[left] != s[right],回文串范围为[left+1, right-1]
            if right - left - 1 > end - start:
                start = left + 1
                end = right - 1
        
        for i in range(len(s)):
            expand_around_center(i, i)        # 以单个字符为中心扩展
            expand_around_center(i, i + 1)    # 以两个字符为中心扩展
        
        return s[start:end + 1]

详细思路

 解释优化后的中心扩展法寻找最长回文子串的代码:

  1. 初始检查

    • 如果输入字符串 s 的长度小于 2,直接返回 s,因为单个字符或空字符串本身就是回文。
  2. 变量初始化

    • start 和 end 初始化为 0。它们用来记录当前找到的最长回文子串的起始和结束索引。
  3. expand_around_center 函数

    • 这个函数用于以给定的 left 和 right 为中心向两边扩展,尝试找到更长的回文子串。
    • left 和 right 分别代表当前扩展的左右边界。
    • 使用 while 循环来检查当前 left 和 right 对应的字符是否相等,并且 left 和 right 在有效范围内。
    • 当不再构成回文(即 s[left] != s[right])时,退出循环。此时找到的回文子串的范围为 [left+1, right-1]
    • 如果当前找到的回文子串长度大于之前记录的最长回文子串长度(即 right - left - 1 > end - start),则更新 start 和 end
  4. 遍历所有可能的中心

    • 使用一个 for 循环遍历字符串 s 的所有字符和字符之间的空隙作为回文中心,调用 expand_around_center 函数来检查并更新最长回文子串的 start 和 end
  5. 返回结果

    • 返回 s[start:end + 1],即最终找到的最长回文子串。

算法复杂度分析:

  • 时间复杂度:O(n^2)。虽然是两重循环,但在每次迭代中的 expand_around_center 函数的操作只涉及线性的扩展,因此总体时间复杂度是可以接受的。
  • 空间复杂度:O(1)。除了存储结果的 start 和 end 外,算法并没有使用额外的空间。

总结:

这种优化的中心扩展法是一种比较直观且有效的方法来寻找字符串中的最长回文子串。通过逐个字符和字符之间的空隙作为中心,向两边扩展并比较字符来确定回文子串的范围,最终找到整个字符串中的最长回文子串。

标签:子串,right,end,笔记,start,算法,left,LeetCode,回文
From: https://blog.csdn.net/m0_73192625/article/details/140450849

相关文章

  • LeetCode算法笔记2
    题目描述给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0 开头。示例1:输入:l1=[2,4,3],l......
  • 长链剖分笔记
    与轻重链剖分相似.dfs1:高度\(h\)、\(son\);dfs2:\(top\).性质1:到根最多\(O(\sqrtn)\)条轻边.(证明:长链长度最坏情况:1,2,3...)性质2:\(x\)的\(k\)级祖先\(y\)所在的长链长度\(\gek\).(证明:若非,则\(y-x\)是一条更长的链,矛盾.)树上\(k\)级祖先\(O(n\logn)-O(1)\):......
  • 【matlab】智能优化算法优化BP神经网络
    目录引言一、BP神经网络简介二、智能优化算法概述三、智能优化算法优化BP神经网络的方法四、蜣螂优化算法案例1、算法来源2、算法描述3、算法性能结果仿真代码实现引言智能优化算法优化BP神经网络是一个重要的研究领域,旨在通过智能算法提高BP神经网络的性能和......
  • 最爽手撕算法个人笔记【第一周-数组】
    27.移除元素给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素。元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。假设nums中不等于val的元素数量为k,要通过此题,您需要执行以下操作:更改nums数组,使nums的前k个元素包含不......
  • 网络安全相关的一些学习笔记
    网络安全?本文主要为《计算机网络》网络安全章节的学习笔记,也包括部分来自其他博客与网站的段落。1.一些名词解释密码编码学(cryptography):密码体制的设计学密码分析学(cryptanalysis):在未知密钥的情况下从密文推演出明文或密钥的技术上述二者合称密码学(cryptology)无条件安全(理......
  • 基于改进K-means的网络数据聚类算法matlab仿真
    1.程序功能描述       K-means属于聚类分析中一种基本的划分方法,常采用误差平方和准则函数作为聚类准则。主要优点是算法简单、快速而且能有效地处理大数据集。研究和分析了聚类算法中的经典K-均值聚类算法,总结出其优点和不足。重点分析了K-均值聚类算法对初始值的依赖性......
  • AcWing 2074:倒计数 ← 双指针算法
    【题目来源】https://www.acwing.com/problem/content/2076/【题目描述】艾弗里有一个由N个正整数构成的数组。数组中的第i个整数是Ai。如果一个连续的子数组的长度为m,并且按顺序包含整数m,m−1,m−2,…,2,1,则称它为m倒计数。例如,[3,2,1]是3倒计数。请帮助艾......
  • 设计模式之装饰模式(学习笔记)
    定义装饰模式(DecoratorPattern),又称为包装模式,是一种结构型设计模式。它允许在不改变现有对象结构的情况下,动态地添加新的功能。通过将每个功能封装在单独的装饰器类中,并且这些装饰器类通过引用原始对象来实现功能的组合,从而提供了灵活性和可扩展性的优势。装饰模式避免了通过继......
  • 矩阵优化 DP 以及全局平衡二叉树实现的动态 DP 学习笔记
    矩阵乘法求斐波那契数列的第\(n\)项,其中\(n\le10^{18}\),对数\(m\)取模。写出转移方程,\(f_i=f_{i-1}+f_{i-2}\),直接算是\(O(n)\)的,似乎没什么办法优化。定义大小分别为\(n\timesp\)和\(p\timesm\)的矩阵(分别为\(a\)和\(b\))相乘的结果(矩阵\(c\))是一个大小为\(......
  • Leetcode.20 有效括号
    题目描述给定一个只包括'(',')','{','}','[',']' 的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。示例输入:s="()"输出:true输入:s="()[]{}"输出:true输入:s=......