代码随想录算法训练营第五十七天 | 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)

动态规划总结链接

感悟

重在理解了

相关推荐
懒惰才能让科技进步18 分钟前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
7年老菜鸡24 分钟前
策略模式(C++)三分钟读懂
c++·qt·策略模式
Ni-Guvara32 分钟前
函数对象笔记
c++·算法
似霰36 分钟前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
芊寻(嵌入式)1 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
獨枭1 小时前
C++ 项目中使用 .dll 和 .def 文件的操作指南
c++
霁月风1 小时前
设计模式——观察者模式
c++·观察者模式·设计模式
橘色的喵1 小时前
C++编程:避免因编译优化引发的多线程死锁问题
c++·多线程·memory·死锁·内存屏障·内存栅栏·memory barrier
泉崎1 小时前
11.7比赛总结
数据结构·算法
你好helloworld1 小时前
滑动窗口最大值
数据结构·算法·leetcode