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

动态规划总结链接

感悟

重在理解了

相关推荐
梓䈑1 小时前
【算法题攻略】BFS 解决FloodFill 算法、最短路问题、多源BFS 和 拓扑排序
c++·算法·宽度优先
Adios7944 小时前
设置交集大小至少为2
数据结构·算法·leetcode
程序喵大人6 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
野生风长10 小时前
C++入门基础:从命名空间到引用与指针的全面解析
开发语言·c++
来一碗刘肉面10 小时前
栈的应用(表达式求值)
数据结构·算法
xiaowang1234shs11 小时前
怪兽轻断食技术深度测评:从断食计时引擎到AI识别算法的工程实践解析
数据库·人工智能·算法·macos·机器学习·p2p·visual studio
小果因子实验室11 小时前
量化研究--策略迁移算法1研究
算法
Escalating_xu12 小时前
C++可变参数模板与引用折叠精讲
开发语言·c++
Web极客码12 小时前
如何用三段式确定性剪枝,为 LLM Agent 砍掉 35% 的 Token 成本?
服务器·人工智能·算法·机器学习