博客
关于我
动态规划系列 712. 两个字符串的最小ASCII删除和
阅读量:193 次
发布时间:2019-02-28

本文共 1694 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要找到两个字符串通过删除一些字符后,使得它们相等,并且删除的字符的ASCII码之和最小。我们可以使用动态规划的方法来解决这个问题。

方法思路

我们定义一个二维数组 dp,其中 dp[i][j] 表示处理到 s1 的前 i 个字符和 s2 的前 j 个字符时,已经找到的最长公共子序列的长度。我们需要找到使得两个字符串相等所需删除字符的ASCII码之和的最小值。

状态转移方程如下:

  • 如果 s1[i-1] 等于 s2[j-1],那么 dp[i][j] = dp[i-1][j-1]。
  • 如果 s1[i-1] 不等于 s2[j-1],那么 dp[i][j] 取删除 s1 中的字符或 s2 中的字符的最小值,即 dp[i+1][j] + s1[i] 和 dp[i][j+1] + s2[j] 中的较小者。
  • 初始化时,dp[i1][i2] 和 dp[i2][i1] 为0,因为当两个字符串都处理完时,总和为0。

    解决代码

    public class Number_712 {    public int minimumDeleteSum(String s1, String s2) {        int i1 = s1.length();        int i2 = s2.length();        int[][] dp = new int[i1 + 1][i2 + 1];        dp[i1][i2] = 0; // 当两个字符串都处理完时,总和是0        // 初始化第一行和第一列        for (int i = i1; i > 0; i--) {            dp[i][i2] = dp[i + 1][i2] + (int) s1.charAt(i - 1);        }        for (int j = i2; j > 0; j--) {            dp[i1][j] = dp[i1][j + 1] + (int) s2.charAt(j - 1);        }        // 填充dp表        for (int i = i1 - 1; i >= 0; i--) {            for (int j = i2 - 1; j >= 0; j--) {                if (s1.charAt(i) == s2.charAt(j)) {                    dp[i][j] = dp[i + 1][j + 1];                } else {                    int option1 = dp[i + 1][j] + (int) s1.charAt(i);                    int option2 = dp[i][j + 1] + (int) s2.charAt(j);                    dp[i][j] = Math.min(option1, option2);                }            }        }        return dp[0][0];    }}

    代码解释

  • 初始化:创建一个二维数组 dp,其大小为 (i1 + 1) x (i2 + 1),其中 i1 和 i2 分别是两个字符串的长度。dp[i1][i2] 和 dp[i2][i1] 初始化为0,因为当两个字符串都处理完时,总和为0。
  • 填充第一行和第一列:处理 s1 的所有字符和 s2 的所有字符,计算删除这些字符后的总和。
  • 填充 dp 表格:从后向前填充 dp 表格,比较当前字符是否相等,决定删除哪个字符或继续匹配下一个字符。
  • 返回结果:最终返回 dp[0][0],即处理完所有字符后的最小删除总和。
  • 这种方法使用动态规划,时间复杂度为 O(n * m), 其中 n 和 m 分别是两个字符串的长度,适用于较大的输入规模。

    转载地址:http://woqn.baihongyu.com/

    你可能感兴趣的文章
    Python基础08 面向对象的基本概念
    查看>>
    Python基础-函数篇
    查看>>
    python基础---->常用模块
    查看>>
    Python基础(2):控制结构
    查看>>
    Python基础 | 关于“循环”那些事
    查看>>
    python系列【仅供参考】:python之subprocess模块rsync拉取文件
    查看>>
    python系列【仅供参考】:python 远程rdp
    查看>>
    python基础
    查看>>
    Python基本语法与变量类型
    查看>>
    python基本数据类型(容器)- tuple list dict set
    查看>>
    python基本工资的调整方案_Python薪资又涨了!这可咋办!
    查看>>
    Python基准测试和性能分析内存管理和垃圾回收
    查看>>
    Python基于RESTful风格的接口自动化测试实战
    查看>>
    python基于flask搭建http服务(四)—— Docker容器化部署
    查看>>
    python基于flask搭建http服务(二)—— 实现Excel上传、数据清洗、入库
    查看>>
    python基于flask搭建http服务(三)—— 使用gunicorn部署项目
    查看>>
    python基于flask搭建http服务(一)—— 实现数据查询和Excel导出
    查看>>
    Python块键盘/鼠标输入
    查看>>
    python在心理学研究中的应用有哪些_心理学在线研究可用平台简介和应用进展
    查看>>
    python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
    查看>>