代码随想录算法训练营第52天 | 647. 回文子串 、516.最长回文子序列
- 回文子串
动态规划解决的经典题目,如果没接触过的话,别硬想 直接看题解。
https://programmercarl.com/0647.回文子串.html
这两题都好难,比较难理解,特别是dp的定义和之前不太一样,而且是一维数组,但是dp是二维数组
这题主要计算字串有多少个是回文串,所以dp值定义成true和false,再用一个变量统计有多少个true
/**
* @param {string} s
* @return {number}
*/
var countSubstrings = function(s) {
const dp = new Array(s.length + 1).fill(false).map(()=> new Array(s.length + 1).fill(false));
let res = 0;
for (let i=s.length-1;i>=0;i--) {
for (let j=i;j<=s.length;j++) {
if (s[i] === s[j]) {
if (j-i<=1) {
dp[i][j] = true;
res++;
} else if (dp[i+1][j-1]) {
dp[i][j] = true;
res++;
}
}
}
}
return res;
};
516.最长回文子序列
647. 回文子串,求的是回文子串,而本题要求的是回文子序列, 大家要搞清楚两者之间的区别。
https://programmercarl.com/0516.最长回文子序列.html
这题也难,但是也有坑,最终的取值是个坑,要明确理解dp的定义
/**
* @param {string} s
* @return {number}
*/
var longestPalindromeSubseq = function(s) {
const dp = new Array(s.length).fill(0).map(()=>new Array(s.length).fill(0));
for (let i=0;i<s.length;i++) {
dp[i][i] = 1;
}
for (let i=s.length-1;i>=0;i--) {
for (let j=i+1;j<s.length;j++) {
if (s[i] === s[j]) {
dp[i][j] = dp[i+1][j-1] + 2;
} else {
dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
}
}
}
return dp[0][s.length-1];
};