首页 > 其他分享 >最长回文子串:动态规划,中心扩展

最长回文子串:动态规划,中心扩展

时间:2024-10-12 20:17:34浏览次数:7  
标签:子串 return len length 最长 dp 回文

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

回文 子串。 

示例 1:

输入:s = "babad"

输出:"bab"

解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"

输出:"bb"

提示:

  • 1
  • s 仅由数字和英文字母组成

动态规划

class Solution(object):
    def longestPalindrome(self, s):
        n = len(s)
        if n < 2:
            return s

        # 初始化一个 n x n 的 DP 表,dp[i][j] 表示 s[i:j+1] 是否为回文子串
        dp = [[False] * n for _ in range(n)]
        start = 0  # 最长回文子串的起始位置
        max_len = 1  # 最长回文子串的长度

        # 单个字符是回文
        for i in range(n):
            dp[i][i] = True

        # 填充 DP 表
        for length in range(2, n + 1):  # length 表示子串长度
            for i in range(n - length + 1):
                j = i + length - 1  # 计算子串的结束位置
                if s[i] == s[j]:
                    if length == 2:
                        dp[i][j] = True  # 两个相同字符的子串是回文
                    else:
                        dp[i][j] = dp[i + 1][j - 1]  # 依赖内部的子串是否为回文

                    # 如果找到更长的回文子串,更新结果
                    if dp[i][j] and length > max_len:
                        start = i
                        max_len = length

        # 返回最长回文子串
        return s[start:start + max_len]

中心扩展

def longestPalindrome(s: str) -> str:
    if len(s) == 0:
        return ""

    def expandAroundCenter(left: int, right: int) -> str:
        # 当左右指针没有越界且两端字符相等时,扩展中心
        while left >= 0 and right < len(s) and s[left] == s[right]:
            left -= 1
            right += 1
        # 返回扩展后找到的最长回文子串
        return s[left + 1:right]

    longest = ""
    for i in range(len(s)):
        # 考虑奇数长度回文
        odd_palindrome = expandAroundCenter(i, i)
        # 考虑偶数长度回文
        even_palindrome = expandAroundCenter(i, i + 1)
        
        # 取最长的回文子串
        longest = max(longest, odd_palindrome, even_palindrome, key=len)

    return longest

# 示例测试
s = "babad"
print(longestPalindrome(s))  # 输出 "bab" 或 "aba"

标签:子串,return,len,length,最长,dp,回文
From: https://blog.csdn.net/weixin_48941116/article/details/142858063

相关文章

  • 30. 串联所有单词的子串
    目录一、问题描述二、解题思路三、代码四、复杂度分析一、问题描述给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含  words 中所有字符串以任意顺序排列连接起来的子串。例如,如果 words=["......
  • Letcode--反转链表+回文链表
     ok小伙伴们,今天给大家带来关于链表的算法题目。首先学习一下反转链表,大家先看题目: 这道题目比较简单,所以先给大家看一下代码:ListNode*reverseList(ListNode*head){if(!head){returnnullptr;}ListNode*pre=nullptr,*cur=h......
  • 503 最长路径
    //503最长路径.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/5/problem/226有一棵n个节点的树,节点编号从1到n。对于每个节点,请求出经过它的长度最长的简单路径有多长。定义一条路径的长度为这条路径上经过了多......
  • 编写一个程序递归判断一个字符串是否为回文。回文是指从前往后读和从后往前读都一样的
    defis_string_palindrome(string):iflen(string)<2:#设置出口returnTrueelse:#判断首末位是否相同ifstring[0]==string[len(string)-1]:#用列表来删除首末位相同字符list1=list(string)list1.pop(0)list1.pop()string=''.join(list1)#设置过程returnis_str......
  • 5. 最长回文子串
    思路首先判断字符串是否是回文,是则直接返回,不是则遍历:从第一个字符开始遍历,判断对应字符串是否是回文且是不是最大长度时间复杂度:O(N^3)动态规划解法:状态初始化为Falsedp[i][j]回文:s[i]=s[j]且[i-1:j-1]也为回文classSolution(object):deflongestPalindrom......
  • (LeetCode 热题 100) 1143. 最长公共子序列(动态规划dp)
    题目:1143.最长公共子序列思路:经典动态规划dp题型,时间复杂度为0(n^2)。C++版本:classSolution{public:intlongestCommonSubsequence(stringtext1,stringtext2){intn=text1.size(),m=text2.size();//状态f[i][j]表示:text1[0,i]和text2[0......
  • 2024年华为OD笔试机试E卷- 关联子串 (java/c++/python)
    华为OD机试E卷2024真题目录(java&c++&python)本人习惯先看输入输出描述,可以明确知道哪些数据已知,需要去得到什么结果,再代入更有目的性地阅读题干内容,快速理解,所以把输入输出描述放在前面,你可以试下这样阅读对你是否有帮助。输入描述输入两个字符串,分别为题目中描述的......
  • 【模板】回文自动机(PAM)(洛谷P5496)
    #include<bits/stdc++.h>#defineendl'\n'#defineintllusingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();constexprllN=5e5+7;namespacePAM{intsize,tot,last;//last:最新插入的字母的编号......
  • [CSP-S 2021] 回文
    算法暴力容易发现双指针可以找到每一个区间\([L,R]\),使得这个区间覆盖\(1\)~\(n\)的每一个数,也即区间外覆盖\(1\)~\(n\)的每一个数,这是\(O(n)\)的考虑判断对于两个数列\(A\),\(B\)显然,在\(A\)中先取出的要在\(B\)中最后取出,所以把\(A\)压入栈......
  • 递归_字符串匹配,最长连续序列
    1:字符串匹配题目链接:LCR137.模糊搜索验证-力扣(LeetCode)可以使用递归的方法来检查 input 是否可以匹配 article。目的是正确处理两种通配符:‘.’和‘*’的匹配规则。defis_match(article:str,input:str)->bool:ifnotinput:returnnotarticle......