博客
关于我
253、两个字符串的最小ASCII删除和
阅读量:161 次
发布时间:2019-02-28

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

为了解决这个问题,我们需要找到两个字符串s1和s2,使得经过删除一些字符后,它们相等,并且使得删除的字符的ASCII值之和最小。

方法思路

这个问题可以通过动态规划来解决。我们定义一个二维数组dp,其中dp[i][j]表示处理到s1的前i个字符和s2的前j个字符时,最小的删除和。状态转移方程如下:

  • 如果s1[i]和s2[j]相等,我们可以选择保留它们,这样dp[i+1][j+1] = dp[i][j]。同时,我们还可以考虑删除其中一个字符,这样总和会增加相应的ASCII值。
  • 如果s1[i]和s2[j]不相等,我们需要删除其中一个字符,这样总和会增加相应的ASCII值。
  • 通过这种方法,我们可以逐步填充dp表,找到最小的删除和。

    解决代码

    public class Solution {    public int minimumDeleteSum(String s1, String s2) {        int n1 = s1.length();        int n2 = s2.length();        int[][] dp = new int[n1 + 1][n2 + 1];        for (int i = 0; i <= n1; i++) {            for (int j = 0; j <= n2; j++) {                dp[i][j] = Integer.MAX_VALUE;            }        }        dp[0][0] = 0;        for (int i = 0; i <= n1; i++) {            dp[i + 1][0] = dp[i][0] + (i > 0 ? s1.charAt(i - 1) : 0);        }        for (int j = 0; j <= n2; j++) {            dp[0][j + 1] = dp[0][j] + (j > 0 ? s2.charAt(j - 1) : 0);        }        for (int i = 0; i <= n1; i++) {            for (int j = 0; j <= n2; j++) {                if (i == 0 && j == 0) continue;                char c1 = s1.charAt(i - 1);                char c2 = s2.charAt(j - 1);                if (c1 == c2) {                    if (dp[i][j] < dp[i + 1][j + 1]) {                        dp[i + 1][j + 1] = dp[i][j];                    }                    if (dp[i][j] + c1 < dp[i + 1][j]) {                        dp[i + 1][j] = dp[i][j] + c1;                    }                    if (dp[i][j] + c2 < dp[i][j + 1]) {                        dp[i][j + 1] = dp[i][j] + c2;                    }                } else {                    if (dp[i][j] + c1 < dp[i + 1][j]) {                        dp[i + 1][j] = dp[i][j] + c1;                    }                    if (dp[i][j] + c2 < dp[i][j + 1]) {                        dp[i][j + 1] = dp[i][j] + c2;                    }                }            }        }        return dp[n1][n2];    }}

    代码解释

  • 初始化一个(n1+1)x(n2+1)的dp数组,初始值为无穷大,dp[0][0]设为0。
  • 填充dp数组的边界情况,当i=0时,dp[i+1][0]表示删除s1前i个字符的总和;同理,j=0时,dp[0][j+1]表示删除s2前j个字符的总和。
  • 填充dp表,逐个处理每个字符,根据字符是否相等,决定保留或删除字符,并更新dp数组。
  • 最终返回dp[n1][n2],即处理完所有字符后的最小删除和。
  • 转载地址:http://rulc.baihongyu.com/

    你可能感兴趣的文章
    oracle 使用 PL/SQL Developer创建表并插入单条、多条数据
    查看>>
    oracle 使用leading, use_nl, rownum调优
    查看>>
    oracle 修改字段类型方法
    查看>>
    Oracle 修改数据库表数据提交之后进行回滚
    查看>>
    UML-总结
    查看>>
    oracle 内存参数示意图
    查看>>
    Oracle 写存储过程的一个模板还有一些基本的知识点
    查看>>
    UML- 配置图(部署图)
    查看>>
    oracle 切割字符串加引号_使用Clean() 去掉由函数自动生成的字符串中的双引号...
    查看>>
    Oracle 创建 DBLink 的方法
    查看>>
    oracle 创建job
    查看>>
    oracle 创建一个用户,只能访问指定的对象
    查看>>
    oracle 创建双向备份,Materialized View 物化视图实现 Oracle 表双向同步
    查看>>
    oracle 创建字段自增长——两种实现方式汇总
    查看>>
    Oracle 升级10.2.0.5.4 OPatch 报错Patch 12419392 Optional component(s) missing 解决方法
    查看>>
    oracle 去重
    查看>>
    oracle 可传输的表空间:rman
    查看>>
    Oracle 启动监听命令
    查看>>
    Oracle 启动阶段 OPEN
    查看>>
    Oracle 在Drop表时的Cascade Constraints
    查看>>