提示:努力生活,开心、快乐的一天
题目链接:392. 判断子序列
dp[i][j] = dp[i - 1][j - 1] + 1
;dp[i][j] = dp[i][j - 1]
;动态规划
var isSubsequence = function (s, t) {
let dp = new Array(s.length + 1).fill(0).map(x => new Array(t.length + 1).fill(0))
for (let i = 1; i <= s.length; i++) {
for (let j = 1; j <= t.length; j++) {
if (s[i - 1] === t[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1
} else {
dp[i][j] = dp[i][j - 1]
}
}
}
return dp[s.length][t.length] === s.length ? true : false
};
dp[i][j]表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t 相同子序列的长度,所以如果dp[s.size()][t.size()] 与 字符串s的长度相同说明:s与t的最长相同子序列就是s,那么s 就是 t 的子序列。
题目链接:115. 不同的子序列
动态规划
var numDistinct = function (s, t) {
//s:父
//t:子
let dp = new Array(s.length + 1).fill(0).map(x => new Array(t.length + 1).fill(0))
//t为空字符串时
for (let i = 0; i <= s.length; i++) {
dp[i][0] = 1
}
for (let i = 1; i <= s.length; i++) {
for (let j = 1; j <= t.length; j++) {
if (s[i - 1] === t[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
} else {
dp[i][j] = dp[i - 1][j]
}
}
}
console.log(dp)
return dp[s.length][t.length]
};
重点需要关注的是:当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。
一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dp[i-1][j-1]。
一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。
编辑距离的题目感觉代码很简单,但是思路确实比较难,也不容易想到