• 代码随想录 Day - 59|#647 回文字串|#516 最长回文子序列


    清单

    ● 647. 回文字串
    ● 516. 最长回文子序列

    LeetCode #647 回文字串

    1. 题目

    给你一个字符串 s ,请你统计并返回这个字符串中回文子串的数目。
    回文字符串是正着读和倒过来读一样的字符串。
    子字符串是字符串中的由连续字符组成的一个序列。
    具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串

    2. 思路

    需要判断回文字符串(正着读和倒过来读)采用二维数组
    增加一个result 参数用于记录True个数 最后return result 即为答案

    1. dp含义: s[i] (正着读) 和 s[j] (倒着读) 能否形成回文字符串
    2. 递推公式 :
      • s[i] != s[j] —> dp[i][j] = False
      • s[i] == s[j]:
        1. j - i <=1 ----> dp[i][j] = True
        1. j - i > 1 -----> dp[i][j] = dp[ i+1 ][ j-1 ]
    3. 初始化: dp[0][0] = False
    4. 遍历顺序: 因为j为倒着读 因此遍历顺序为从下至上 从左往右(类比双指针)

    3. 代码实现

    class Solution:
        def countSubstrings(self, s: str) -> int:
            #Initial dp
            dp = [[False] * len(s) for _ in range(len(s))]
    
            result = 0
    
            for i in range(len(s)-1, -1, -1):
                for j in range(i, len(s)):
                    if s[i] == s[j]:
                        if j - i <= 1:
                            dp[i][j] = True
                            result += 1
                        elif dp[i+1][j-1]:
                            dp[i][j] = True
                            result += 1
            return result
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    LeetCode #516 最长回文子序列

    1. 题目

    给你一个字符串 s,找出其中最长的回文子序列,并返回该序列的长度。
    子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

    2. 思路

    需要统计回文字符串长度(正着读和倒过来读)采用二维数组

    1. dp含义: s[i] (正着读) 和 s[j] (倒着读) 形成的回文字符串长度为dp[i][j]
    2. 递推公式 :
      • s[i] != s[j] —> dp[i][j] = max(dp[i+1][j], dp[i][j-1])
      • s[i] == s[j]: dp[i][j] = dp[i+1][j-1] + 2
    3. 初始化: dp[0][0] = 0, dp[i][i] = 1
    4. 遍历顺序: 因为j为倒着读 因此遍历顺序为从下至上 从左往右(类比双指针)

    3. 代码实现

    class Solution:
        def longestPalindromeSubseq(self, s: str) -> int:
            #Initial dp
            dp = [[0] * len(s) for _ in range(len(s))]
            for i in range(len(s)):
                dp[i][i] = 1
            for i in range(len(s)-1, -1, -1):
                for j in range(i + 1, len(s)):
                    if s[i] == s[j]:
                        dp[i][j] = dp[i+1][j-1] + 2 
                    else:
                        dp[i][j] = max(dp[i+1][j], dp[i][j-1])
    
            return dp[0][-1]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    【服务器数据恢复】SAN LUN映射出错导致文件系统数据丢失的数据恢复案例
    递推和记忆化搜索--The Triangle--poj1163
    使用Azure下载数据集方法
    HashMap JDK1.7与1.8的区别
    3DCAT+东风日产:共建线上个性化订车实时云渲染方案
    C++设计模式
    基于VUE + Echarts 实现可视化数据大屏农村信息可视化
    文娱行业搜索最佳实践
    Ubuntu 桌面系统升级
    计算机网络——第六章笔记(2)
  • 原文地址:https://blog.csdn.net/weixin_54191598/article/details/133608492