噜啦噜啦噜呼呼呼 2024-03-30 23:40 采纳率: 70.7%
浏览 2
已结题

力扣最长回文子序列动态规划

img

我哪里有问题啊,请大家批评指正<敬礼>

int dp[1000][1000];  //dp[i][j]表示到s1的第i位字符和s2的第j位字符为止,两者之间的公有子序列的最大程度
int longestcommon(char *s1,char *s2)   //判断s1和s2的公有子序列的最大长度
{
    int n=strlen(s1);
    int m=strlen(s2);
    int i,j;
    memset(dp,0,sizeof(dp));
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            int temp=(s1[i]==s2[j]? 1:0);
            if(i==0&&j==0)
                dp[i][j]=temp;
            else if(i==0)
                dp[i][j]=dp[i][j-1]||temp;
            else if(j==0)
                dp[i][j]=dp[i-1][j]||temp;
            else if(temp)
                dp[i][j]=dp[i-1][j-1]+1;
            else
                dp[i][j]=(dp[i-1][j]>dp[i][j-1]? dp[i-1][j]:dp[i][j-1]);
        }
    }
    return dp[n-1][m-1];
}
int longestPalindromeSubseq(char* s) {
    int n=strlen(s),i;
    char s3[1001];
    for(i=0;i<n;i++)   //实现s的逆字符串
        s3[i]=s[n-1-i];
    return longestcommon(s,s3);
}

img

  • 写回答

3条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-03-30 23:40
    关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    问题分析: 根据题目要求,我们需要找出给定字符串s中的最长回文子序列,并返回该序列的长度。动态规划是解决最长回文子序列的常用方法,但你的代码存在以下几个问题:

    1. 动态规划数组大小不合理:你声明的二维数组dp的大小为[1000][1000],但题目给定的条件是字符串长度不超过1000,这意味着你的数组大小不够大,会导致数组越界错误。

    2. 未正确实现最长公共子序列:longestcommon函数的目的是计算s1和s2的最长公共子序列长度,但你在计算dp数组的过程中出现了错误。具体来说,当两个字符相等时,你应该在dp[i-1][j-1]的基础上加1来更新dp[i][j],而不是直接将dp[i-1][j-1]赋值给dp[i][j]。

    解决方案:

    1. 修改动态规划数组大小:根据题目给定条件,修改二维数组dp的大小为[1001][1001],以确保足够容纳字符串的长度。

    2. 修正最长公共子序列计算过程:在temp等于1时,将dp[i][j]更新为dp[i-1][j-1]+1,表示当前的公共子序列长度比之前的长度多1。

    3. 返回结果:在longestPalindromeSubseq函数中,直接返回longestcommon(s, s3)的结果即可。

    修改后的代码如下:

    int dp[1001][1001];  // dp[i][j]表示到s1的第i位字符和s2的第j位字符为止,两者之间的公有子序列的最大长度
    
    int longestcommon(char *s1, char *s2) {
        int n = strlen(s1);
        int m = strlen(s2);
        int i, j;
        memset(dp, 0, sizeof(dp));
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                int temp = (s1[i] == s2[j] ? 1 : 0);
                if (i == 0 && j == 0)
                    dp[i][j] = temp;
                else if (i == 0)
                    dp[i][j] = dp[i][j - 1] || temp;
                else if (j == 0)
                    dp[i][j] = dp[i - 1][j] || temp;
                else if (temp)
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                else
                    dp[i][j] = (dp[i - 1][j] > dp[i][j - 1] ? dp[i - 1][j] : dp[i][j - 1]);
            }
        }
        return dp[n - 1][m - 1];
    }
    
    int longestPalindromeSubseq(char *s) {
        int n = strlen(s), i;
        char s3[1001];
        for (i = 0; i < n; i++)  // 实现s的逆字符串
            s3[i] = s[n - 1 - i];
        return longestcommon(s, s3);
    }
    

    希望以上解答对你有帮助,如果有任何疑问,请随时追问。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月1日
  • 创建了问题 3月30日

悬赏问题

  • ¥15 使用ESP8266连接阿里云出现问题
  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角