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

动态规划总结链接

感悟

重在理解了

相关推荐
iAkuya1 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼1 小时前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck1 小时前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
松☆1 小时前
CANN与大模型推理:在边缘端高效运行7B参数语言模型的实践指南
人工智能·算法·语言模型
_F_y1 小时前
C++重点知识总结
java·jvm·c++
java干货2 小时前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
皮皮哎哟2 小时前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序
程序员清洒2 小时前
CANN模型剪枝:从敏感度感知到硬件稀疏加速的全链路压缩实战
算法·机器学习·剪枝
vortex52 小时前
几种 dump hash 方式对比分析
算法·哈希算法
堕2742 小时前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法