代码随想录算法训练营第五十五天 |392. 判断子序列、115. 不同的子序列

59 阅读1分钟

代码随想录算法训练营第五十五天 |392. 判断子序列、115. 不同的子序列

392. 判断子序列

题目链接:392. 判断子序列

  • 和LCS类似
  • 二分法

115. 不同的子序列

题目链接:115. 不同的子序列

  • 这道题目如果不是子序列,而是要求连续序列的,那就可以考虑用KMP。

  • dp含义:i - 1为结尾的s中有 j - 1为结尾的t的个数为dp[i][j]

  • 递推公式:

    • if(s[i] = t[j]) {dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]}
    • else if(s[i] != t[j]) { dp[i][j] = dp[i - 1][j]}
  • 但如果 s[0] 可以匹配 t[0],那么又有两种情况,这两种情况是累加的关系:

    1、让 s[0] 匹配 t[0],那么原问题转化为在 s[1..] 的所有子序列中计算 t[1..] 出现的次数。

    2、不让 s[0] 匹配 t[0],那么原问题转化为在 s[1..] 的所有子序列中计算 t[0..] 出现的次数。

    为啥明明 s[0] 可以匹配 t[0],还不让它俩匹配呢?主要是为了给 s[0] 之后的元素匹配的机会,比如 s = "aab", t = "ab",就有两种匹配方式:a_b_ab

  • 球盒模型,两种方式。