剑指 Offer II 097. 子序列的数目

140 阅读1分钟

剑指 Offer II 097. 子序列的数目

给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。

字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)

方程式

  • dp[i][j] = dp[i+1][j+1] + dp[i+1][j] (当s[i] === t[j])
  • dp[i][j] = dp[i+1][j] (当s[i] !== t[j])
var numDistinct = function (s, t) {
  var m = s.length;
  var n = t.length;
  if (m < n) return 0;
  var dp = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0));
  for (var i = 0; i <= m; i++) {
    dp[i][n] = 1;
  }
  for (var i = m - 1; i >= 0; i--) {
    for (var j = n - 1; j >= 0; j--) {
      if (s[i] == t[j]) {
        dp[i][j] = dp[i + 1][j + 1] + dp[i + 1][j];
      } else {
        dp[i][j] = dp[i + 1][j];
      }
    }
  }
  return dp[0][0];
};