• My Ninety-ninth Page - 两个字符串的删除操作 - By Nicolas


    这篇page是针对leetcode上的583.两个字符串的删除操作所写的。小尼先简单的说明一下这道题的意思,就是给定单词word1和word2,找到使得word1和word2相同所需的最小步数,每步可以删除任意一个字符串的一个字符。

    小尼接下来写一下动态规划五部曲:

    1.确定dp数组(dp table)以及下标的含义:

    dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。

    这里dp数组的定义有点点绕,大家要撸清思路。

    2.确定递推公式:

    • 当word1[i - 1] 与 word2[j - 1]相同的时候
    • 当word1[i - 1] 与 word2[j - 1]不相同的时候

    当word1[i - 1] 与 word2[j - 1]相同的时候,dp[i][j] = dp[i - 1][j - 1];

    当word1[i - 1] 与 word2[j - 1]不相同的时候,有三种情况:

    情况一:删word1[i - 1],最少操作次数为dp[i - 1][j] + 1

    情况二:删word2[j - 1],最少操作次数为dp[i][j - 1] + 1

    情况三:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2

    那最后当然是取最小值,所以当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});

    因为dp[i - 1][j - 1] + 1等于 dp[i - 1][j] 或 dp[i][j - 1],所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);

    3.dp数组如何初始化:从递推公式中,可以看出来,dp[i][0] 和 dp[0][j]是一定要初始化的。dp[i][0]:word2为空字符串,以i-1为结尾的字符串word1要删除多少个元素,才能和word2相同呢,很明显dp[i][0] = i。

    4.确定遍历顺序:从递推公式 dp[i][j] = min(dp[i - 1][j - 1] + 2, min(dp[i - 1][j], dp[i][j - 1]) + 1); 和dp[i][j] = dp[i - 1][j - 1]可以看出dp[i][j]都是根据左上方、正上方、正左方推出来的。所以遍历的时候一定是从上到下,从左到右,这样保证dp[i][j]可以根据之前计算出来的数值进行计算。

    5.推导出dp数组

    小尼接下来拉一下这道题的解题代码:

    1. class Solution {
    2. public int minDistance(String word1, String word2) {
    3. int[][] dp = new int[word1.length() + 1][word2.length() + 1];
    4. for (int i = 0; i < word1.length() + 1; i++) dp[i][0] = i;
    5. for (int j = 0; j < word2.length() + 1; j++) dp[0][j] = j;
    6. for (int i = 1; i < word1.length() + 1; i++) {
    7. for (int j = 1; j < word2.length() + 1; j++) {
    8. if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
    9. dp[i][j] = dp[i - 1][j - 1];
    10. }else{
    11. dp[i][j] = Math.min(dp[i - 1][j - 1] + 2,
    12. Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1));
    13. }
    14. }
    15. }
    16. return dp[word1.length()][word2.length()];
    17. }
    18. }

    希望上面的代码可以帮助到小伙伴们~~~

  • 相关阅读:
    【笔记】回顾JavaWeb结合自身开发的项目——分层解耦与IOC、MySQL简单查询
    STM32 GPIO工作原理
    小程序页面跳转使用reLaunch遇到的坑
    Windows 11 如何同步文件到OneDrive ?
    Zabbix技术分享——使用Zabbix监控系统日志文件大小
    shell算数运算指令、shell的if分支结构使用场景及相关代码
    java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
    Python经典书籍有哪些?这份书单送给你_黑马程序员
    宁波建筑模板厂家直销-桉木芯建筑模板
    pytest框架二次开发
  • 原文地址:https://blog.csdn.net/weixin_51658729/article/details/128211432