动态规划_20230412

115、不同的子序列

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

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

解题思路:

序列初始化自然是用空字符串分别和s和t去比较进行初始化,最终的状态即是dp[s.length()][t.length],出现0的情况是可能的(根本没出现过)

s[i - 1] != s[j - 1]时,很明显从之前的状态dp[i - 1][j]继承下来就可以。但是当两者相等的时候,除了从dp[i - 1][j - 1]继承下来之外,依然要考虑dp[i - 1][j],因为可以不用s[i - 1],因此dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];

72、编辑距离

给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

示例 1:

输入:word1 = "horse", word2 = "ros" 输出:3

解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e')

解题思路:

三种操作分别对应着三个状态(此处以s变成t的视角,s纵t横),然后在此基础上加一(操作)

  • 插入:dp[i - 1][j]

  • 删除:dp[i][j - 1]

  • 替换:dp[i - 1][j - 1]

如果s[i - 1] != t[j - 1]时则以上三种情况取最小值即可

如果相等则继承dp[i - 1][j - 1]即可,不能用Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1])),因为dp[i][j - 1]可能比dp[i - 1][j - 1]还小

posted @   XCCX0824  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示