博客
关于我
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中is和==操作符
    查看>>
    python中range()函数的返回值是多少?
    查看>>
    Python中range对象的使用以及打印九九乘法表
    查看>>
    Python中reshape函数参数-1的意思?
    查看>>
    Python中set.discard和set.remove方法之间的运行时差异?
    查看>>
    Python接口自动化测试企业级实战
    查看>>
    python中tkinter中value_输入字段中的python Tkinter get()值
    查看>>
    Python中wx.FlexGridSizer
    查看>>
    Python中xPath技术和BeautifulSoup的使用
    查看>>
    python中yield的用法详解——最简单,最清晰的解释
    查看>>
    python中‘set.intersection()‘的算法是什么?
    查看>>
    Python中一个图形中的多个绘图
    查看>>
    python中一个好的持久同步队列
    查看>>
    Python中不准确的对数
    查看>>
    python中什么是实例方法_在Python中创建实例方法对象的不同方法
    查看>>
    Python中使用cutecharts实现简单的手绘风格的图表
    查看>>
    python中使用dxfgrabber,解析dxf文件信息生成obj文件
    查看>>
    Python中使用ncmbot玩转网易云音乐
    查看>>
    Python中使用PIL快速实现二值图
    查看>>
    Python中使用PIL快速实现灰度图
    查看>>