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

    你可能感兴趣的文章
    nginx添加模块与https支持
    查看>>
    Nginx的Rewrite正则表达式,匹配非某单词
    查看>>
    Nginx的使用总结(一)
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NI笔试——大数加法
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
    查看>>
    npm的问题:config global `--global`, `--local` are deprecated. Use `--location=global` instead 的解决办法
    查看>>
    NR,NF,FNR
    查看>>
    nrf开发笔记一开发软件
    查看>>
    NSDateFormatter的替代方法
    查看>>
    NSSet集合 无序的 不能重复的
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    nullnullHuge Pages
    查看>>