首页 > 其他分享 >【每日一题】最长回文子串

【每日一题】最长回文子串

时间:2024-05-10 16:55:37浏览次数:13  
标签:子串 r2 边界条件 字符串 最长 dp 回文

5. 最长回文子串

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

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

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

示例 2:

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

提示:

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

这题常规思路是用动规,如果一个回文串前后相邻的两字符相同,那么就可以扩张成一个新回文串。边界条件就是子串的长度为1或2,长为1的子串自然是回文串,长为2若两个字符相同那么也是回文串。换个角度我们也可以从边界条件外推,也就是中心扩展法。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        # dp(i,j)表示s[i..j]是否是回文喘
        # dp[i,i] = 1
        # dp(i,i+1) = 1 when s[i]==s[i+1]
        # dp(i,j) = 1 when dp(i+1,j-1)==1 and s[i]==s[j]
        
        # 从边界条件向外扩展
        def expand(s, l, r):
            while l >= 0 and r < len(s) and s[l] == s[r]:
                l -= 1
                r += 1
            return l+1, r-1

        l, r = 0, 0
        for i in range(len(s)):
            l1, r1 = expand(s, i, i) # 边界条件 长度为1的子串
            l2, r2 = expand(s, i, i+1) # 边界条件 长度为2的子串
            if (r1-l1) > (r-l):
                l, r = (l1, r1)
            if (r2-l2) > (r-l):
                l, r = (l2, r2)
        return s[l: r+1]

 

标签:子串,r2,边界条件,字符串,最长,dp,回文
From: https://www.cnblogs.com/Aikoin/p/18184841

相关文章

  • 图上的环和最长路
    1.有向图找环HDOJ3342LegalorNothttps://acm.hdu.edu.cn/showproblem.php?pid=3342题意:给一个\(N\)个点\(N\)条边的有向图,第\(i(1\leqM)\)条边从\(a_i\)连向\(b_i\),询问该图是否无环。\(2\leqN,M\leq100,0\leqa_i,b_i\leqN-1\)题解:建图然后......
  • leetCode 128. 最长连续序列
    给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums=[0,3,7,......
  • P1435 [IOI2000] 回文字串
    原题链接题解1.把字符串倒过来,记作\(S_1\)其最大公共子串是回文串,所以这部分可以不用求,字符串长度减去最大公共子串的长度就是答案2.怎么求最大公共子串的长度呢?假设我们已经知道字符串a和字符串b及其所有子串的lbs,此时往字符串b末尾添加一个字符c变成字符串b1,而字符串a中以......
  • 131. 分割回文串-c++
    给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]示例2:输入:s="a"输出:[["a"]]classSolution{public:vector<vector......
  • 最长子序列
    为了解决这个问题,我们可以使用滑动窗口的方法。滑动窗口可以让我们在不需要嵌套循环的情况下遍历序列中所有的连续子序列。以下是这个方法的步骤:初始化两个指针start和end,都指向序列的开始。初始化当前和current_sum为0。移动end指针,每次移动都将end指向的值加到c......
  • 力扣1218.最长定差子序列
    题目给你一个整数数组arr和一个整数difference,请你找出并返回arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于difference。​ 子序列是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从arr派生出来的序列。解题思路​ 动态规划1.常......
  • 洛谷题单指南-动态规划2-P1435 [IOI2000] 回文字串
    原题链接:https://www.luogu.com.cn/problem/P1435解题思路:方法1:回文字串的特点是,正着读、反着读是一样的换一个思路,对于一个字符串s,正序、逆序公共的部分就是已经是回文的部分,剩余的部分就是要插入的字符所以,问题转换为,计算一个字符串正序、逆序的最长公共子串,然后剩下的长度......
  • 2024-05-04:用go语言,给定一个起始索引为0的字符串s和一个整数k。 要进行分割操作,直到字
    2024-05-04:用go语言,给定一个起始索引为0的字符串s和一个整数k。要进行分割操作,直到字符串s为空:选择s的最长前缀,该前缀最多包含k个不同字符;删除该前缀,递增分割计数。如果有剩余字符,它们保持原来的顺序。在操作之前,可以修改字符串s中的一个字符为另一个小写英文字母。在最佳情......
  • leetcode算法热题--最长连续序列
    题目给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums=......
  • leetcode算法热题--最长连续序列
    题目给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums=......