LeetCode上不同的子序列,困难难度,参考官方题解,记录下解题思路
这道题想到动态规划思路不难,难的是要怎么创建动态方程
以s = "babgbag", t = "bag"
为例
首先建立对应的二维数组,并且要多添加一行一列,作为空字符串的情况
第一行全部填充1,因为在任何字符串里面取空字符串都能取到1个
第一列从1开始全部填0,因为从空字符串中除了取空字符串其他都不能取到
整个二维数组表示的是t的前j个字符与s的前s个字符成功匹配的个数
之后开始填充数组
以选中的位置为例,此时
s[i - 1] === t[j-1]
,s/t字符串当前位置的元素相同,那么就分为在此位置匹配和不在此位置匹配两种情况,最后获得的方程是dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
var numDistinct = function(s, t) {
// 保存两个字符串的长度
const sLen = s.length,
tLen = t.length
// 创建个二维数组,并且都填充0
dp = Array.from(Array(sLen+1),() => Array(tLen+1).fill(0))
// 填充二维数组
for (let i = 0; i < sLen+1; i++) {
for (let j = 0; j < tLen+1; j++) {
// 第一行全为1
if (j == 0) {
dp[i][j] = 1
} else if (i == 0) {
// 第一列为0
dp[i][j] = 0
} else {
// 填充数组
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]
}
}
}
}
// 返回结果
return dp[sLen][tLen]
};