动态规划_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]
还小
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构