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

647. 回文子串

力扣题目链接

思路

动态规划

  • dp[i][j] 表示[i,j]的子字符串是否为回文字符串
  • 递推公式:
  • s[i]!=s[j] dp[i][j]=false;
  • s[i]==s[j] if(j-i<=1) dp[i][j]=true; else if(dp[i+1][j-1]) dp[i][j]=true;
  • 初始化:都初始化为fals
  • 遍历顺序:从下往上,从左往右

双指针法

  • 枚举每一个可能的回文中心,然后用两个指针分别向左右两边拓展,当两个指针指向的元素相同的时候就拓展,否则停止拓展。
  • 一个元素可以作为中心点,两个元素也可以作为中心点

代码

动态规划

class Solution {
public:
    /*
     * dp[i][j] 表示[i,j]的子字符串是否为回文字符串
     * 递推公式:
     * s[i]!=s[j] dp[i][j]=false;
     * s[i]==s[j] if(j-i<=1) dp[i][j]=true; else if(dp[i+1][j-1]) dp[i][j]=true;
     * 初始化:都初始化为false
     * 遍历顺序:从下往上,从左往右
    */
    int countSubstrings(string s) {
        vector> dp(s.size(),vector(s.size(),false));
        int result=0;
        for(int i=s.size()-1;i>=0;i--){
            for(int j=i;j

我的解法

class Solution {
public:
    /*
     * dp[i][j] 表示[j,i]的子字符串是否为回文字符串
     * 递推公式:
     * 初始化:for(int i=0;i> dp(s.size(),vector(s.size(),false));
        for(int i=0;i
  • 时间复杂度O(n^2)
  • 空间复杂度O(n^2)

双指针法

class Solution {
public:
    int extend(const string& s, int i, int j, int n){
        int res=0;
        while(i>=0&&j
  • 时间复杂度O(n^2)
  • 空间复杂度O(1)

516.最长回文子序列

力扣题目链接

思路

  • dp[i][j] 表示在[i,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]);
  • 初始化:对角线都为1
  • 遍历顺序:从下往上,从左往右

代码

class Solution {
public:
    /*
     * dp[i][j] 表示在[i,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]);
     * 初始化:对角线都为1
     * 遍历顺序:从下往上,从左往右
    */
    int longestPalindromeSubseq(string s) {
        vector> dp(s.size(),vector(s.size(),0));
        for(int i=0;i=0;i--){
            for(int j=i+1;j
  • 时间复杂度O(n^2)
  • 空间复杂度O(n^2)

你可能感兴趣的:(代码随想录刷题,算法,动态规划,leetcode)