代码随想录算法训练营第五十七天 | 647. 回文子串、516. 最长回文子序列

代码随想录算法训练营第五十七天 | 647. 回文子串、516. 最长回文子序列

647. 回文子串

题目

解法

题解链接

  1. 动态规划
cpp 复制代码
class Solution {
public:
    int countSubstrings(string s) {
        // dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。
        vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));
        int result = 0;
        for(int i = s.size()-1; i >= 0; i--){
            for(int j = i; j < s.size(); j++){
                if(s[i] == s[j] && (j-i <= 1 || dp[i+1][j-1])){
                    result++;
                    dp[i][j] = true;
                }
            }
        }
        return result;
    }
};

时间复杂度:O( n^2)

空间复杂度:O(n^2 )

2.双指针

cpp 复制代码
class Solution {
public:
    int countSubstrings(string s) {
        // 首先确定回文串,就是找中心然后向两边扩散看是不是对称的就可以了。
        // 在遍历中心点的时候,要注意中心点有两种情况。
        // 一个元素可以作为中心点,两个元素也可以作为中心点。
        vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));
        int result = 0;
        for(int i = s.size()-1; i >= 0; i--){
            result += extend(s, i, i, s.size());
            result += extend(s, i, i+1, s.size());
        }
        return result;
    }
    int extend(string s,int i, int j, int n){
        int res = 0;
        while(i >=0 && j < n && s[i] == s[j]){
            i--;
            j++;
            res++;
        }
        return res;
    }
};

时间复杂度:O( n^2)

空间复杂度:O(1 )

516. 最长回文子序列

题目

解法

题解链接

  1. 动态规划
cpp 复制代码
class Solution {
public:
    int longestPalindromeSubseq(string s) {
        // dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。
        vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0));
        for(int i = s.size()-1; i >= 0; i--) dp[i][i] = 1;
        for(int i = s.size()-1; i >= 0; i--){
            for(int j = i+1; j < s.size(); j++){
                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][s.size()-1];
    }
};

时间复杂度:O(n^2 )

空间复杂度:O( n^2)

动态规划总结链接

感悟

重在理解了

相关推荐
2301_793804694 分钟前
C++中的适配器模式变体
开发语言·c++·算法
x_xbx7 分钟前
LeetCode:206. 反转链表
算法·leetcode·链表
abant29 分钟前
leetcode 138 复制随机链表
算法·leetcode·链表
ab15151729 分钟前
3.17二刷基础112 118 完成进阶52
数据结构·算法
美式请加冰35 分钟前
链表的介绍和使用
数据结构·链表
旖-旎1 小时前
二分查找(1)
c++·算法·二分查找·力扣·双指针
困死,根本不会1 小时前
【C 语言】指针学习笔记:从底层原理到实战应用
c语言·开发语言·笔记·学习·算法
小范自学编程1 小时前
算法训练营 Day38 - 动态规划part07
算法·动态规划
星空露珠2 小时前
迷你世界UGC3.0脚本Wiki全局函数
开发语言·数据库·算法·游戏·lua
小王不爱笑1322 小时前
排序算法 Java
数据结构·算法·排序算法