提示:努力生活,开心、快乐的一天
题目链接:647. 回文子串
if (s[i] == s[j]) {
if (j - i <= 1) { // 情况一 和 情况二
result++;
dp[i][j] = true;
} else if (dp[i + 1][j - 1]) { // 情况三
result++;
dp[i][j] = true;
}
}
动态规划
var countSubstrings = function (s) {
let len = s.length
let res = 0
let dp = new Array(len).fill(false).map(x => new Array(len).fill(false))
for (let j = 0; j<len; j++) {
for (let i = 0; i <=j; i++) {
if (s[i] === s[j]) {
if (j - i <= 1) {
dp[i][j] = true
} else {
dp[i][j] = dp[i + 1][j - 1]
}
res += dp[i][j] ? 1 : 0
}
}
}
return res
};
动态规划的空间复杂度是偏高的,双指针法:
首先确定回文串,就是找中心然后向两边扩散看是不是对称的就可以了。
在遍历中心点的时候,要注意中心点有两种情况。
一个元素可以作为中心点,两个元素也可以作为中心点。
那么有人同学问了,三个元素还可以做中心点呢。其实三个元素就可以由一个元素左右添加元素得到,四个元素则可以由两个元素左右添加元素得到。
所以我们在计算的时候,要注意一个元素为中心点和两个元素为中心点的情况。
题目链接:516. 最长回文子序列
动态规划
var longestPalindromeSubseq = function(s) {
let len = s.length
let dp = new Array(len).fill(0).map(x => new Array(len).fill(0))
for (let i = 0; i < len; i++){
dp[i][i] = 1
}
for (let i = len - 1; i >= 0; i--){
for (let j = i + 1; j < len; j++){
if (s[i] === s[j]) {
dp[i][j] = dp[i+1][j-1]+2
} else {
dp[i][j] = Math.max(dp[i][j-1],dp[i+1][j])
}
}
}
return dp[0][len-1]
};
时刻牢记dp[i][j]的含义
回文子串是要连续的,回文子序列可不是连续的!
动态规划基本完事啦,哈哈哈哈哈