博客
关于我
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/

    你可能感兴趣的文章
    PYTHON--欧拉习题二
    查看>>
    python--高级应用总结
    查看>>
    python-520表白代码,我看谁说程序员不懂浪漫,送你几套表白代码,一步到位
    查看>>
    Python-Asyncio TypeError:无法在‘;等待‘;表达式中使用对象DICT
    查看>>
    Python-AttributeError:‘;dict&39;对象没有属性‘;序列‘;
    查看>>
    Python-ldap:是否可以在不显式写入密码的情况下进行绑定?
    查看>>
    python出现 unknown encoding: idna 的处理方法
    查看>>
    Python出现 RuntimeError: dictionary changed size during iteration 的解决方法
    查看>>
    Python-numpy(2)数组的操作
    查看>>
    Python-Numpy的tile函数用法
    查看>>
    python-open函数
    查看>>
    Python-Pandas-将特定函数应用于给定级别-多索引数据框架
    查看>>
    python-queue队列通信
    查看>>
    python-ros No module named PyKDL
    查看>>
    python-social-auth 是否需要会话
    查看>>
    Python再获年度编程语言,微软或成最大赢家
    查看>>
    python-week5
    查看>>
    Python写表情包搜索工具(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    Python-【1】配置
    查看>>
    Python-从子文件夹执行绝对导入
    查看>>