- 回文子串
动态规划解决的经典题目,如果没接触过的话,别硬想 直接看题解。
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];
};
动态规划总结篇
https://programmercarl.com/动态规划总结篇.html