学习日记--leecode 1771

题干:

给你两个字符串 word1 和 word2 ,请你按下述方法构造一个字符串:

从 word1 中选出某个 非空 子序列 subsequence1 。
从 word2 中选出某个 非空 子序列 subsequence2 。
连接两个子序列 subsequence1 + subsequence2 ,得到字符串。
返回可按上述方法构造的最长 回文串 的 长度 。如果无法构造回文串,返回 0 。

字符串 s 的一个 子序列 是通过从 s 中删除一些(也可能不删除)字符而不更改其余字符的顺序生成的字符串。

回文串 是正着读和反着读结果一致的字符串。

思路:

把word1和word2合并成一个新的字符串,从头和尾去分析寻找回文字符串(头一定是word1中的,尾一定是word2中的) ,且再所有字符串中单个字符自身可构成回文。具体分为a*******a问题和a**********b问题

源码:

#define N 2021

#define max(a,b) ((a) < (b) ? (b) : (a))    //定义max的用法

int dp[N][N];

int longestPalindrome(char * word1, char * word2){

    int n1 = strlen(word1), n2 = strlen(word2);

    int n = n1 + n2;

    char* s = (char*)calloc(n + 1, sizeof(s));

    strcat(s, word1),strcat(s, word2);

    int ans = 0;

    for(int i = 0; i < n; i++) dp[i][i] = 1;             //把字符串的dp初始化为1

    for(int i = n - 2, k = n -1; i >= 0; i--, k--){

        for(int j =k; j < n; j++){

            if(s[i] == s[j]){

                dp[i][j] = dp[i + 1][j -1] + 2;           //a****a问题,再****中再去找寻找回归字串

                if(i < n1 && j >= n1)   ans = max(ans, dp[i][j]);

            }

            else dp[i][j] = max(dp[i + 1][j],dp[i][j - 1]);//a****b问题,再****b和a****中去寻找回归字串

        }

    }

    return ans;

}

补充:

 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。

C 库函数 void *calloc(size_t nitems, size_t size) 分配所需的内存空间,并返回一个指向它的指针。malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。

链接:

https://www.bilibili.com/video/BV1Cp4y1H7Xq

https://www.runoob.com/cprogramming/c-function-calloc.html

https://www.runoob.com/cprogramming/c-function-strcat.html

题目链接:

https://leetcode-cn.com/problems/maximize-palindrome-length-from-subsequences/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值