所以呢,案例2 其实和案例1 差别不大,就是多了个变量来临时保存。最终代码如下(但是初学者话,代码也没那么好写)
代码如下 public int minDistance(String word1, String word2) { int n1 = word1.length(); int n2 = word2.length(); int[] dp = new int[n2 + 1]; // dp[0...n2]的初始值 for (int j = 0; j <= n2; j++) dp[j] = j; // dp[j] = min(dp[j-1], pre, dp[j]) + 1 for (int i = 1; i <= n1; i++) { int temp = dp[0]; // 相当于初始化 dp[0] = i; for (int j = 1; j <= n2; j++) { // pre 相当于之前的 dp[i-1][j-1] int pre = temp; temp = dp[j]; // 如果 word1[i] 与 word2[j] 相等。第 i 个字符对应下标是 i-1 if (word1.charAt(i - 1) == word2.charAt(j - 1)){ dp[j] = pre; }else { dp[j] = Math.min(Math.min(dp[j - 1], pre), dp[j]) + 1; } // 保存要被抛弃的值 } } return dp[n2]; } 总结上面的这些题,基本都是不怎么难的入门题,除了最后一道相对难一点。并且基本 80% 的二维矩阵 dp 都可以像上面的方法一样优化成 一维矩阵的 dp,核心就是要画图,看他们的值依赖,当然,还有很多其他比较难的优化,但是,我遇到的题中,大部分都是我上面这种类型的优化。后面如何遇到其他的,我会作为案例来讲,今天就先讲最普遍最通用的优化方案。记住,画二维 dp 的矩阵图,然后看元素之间的值依赖,然后就可以很清晰着知道该如何优化了。
在之后的文章中,我也会按照这个步骤,在给大家讲四五道动态规划 hard 级别的题,会放在每天推文的第二条给大家学习。如果觉得有收获,不放三连走起来(点赞、感谢、分享),嘻嘻。
有收获?希望老铁们来个三连击,给更多的人看到这篇文章1、点赞,可以让更多的人看到这篇文章
2、关注我的原创微信公众号『苦逼的码农』,第一时间阅读我的文章,已写了 150+ 的原创文章。
公众号后台回复『电子书』,还送你一份电子书大礼包哦。
作者简洁作者:帅地,一位热爱、认真写作的小伙,目前维护原创公众号:『苦逼的码农』,已写了150多篇文章,专注于写 算法、计算机基础知识等提升你内功的文章,期待你的关注。
转载说明:务必注明来源(注明:来源于公众号:苦逼的码农, 作者:帅地)