2021/03/17 每日一题 不同的子序列

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]
};
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容