题干:
给你两个字符串 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/