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

    你可能感兴趣的文章
    Network Dissection:Quantifying Interpretability of Deep Visual Representations(深层视觉表征的量化解释)
    查看>>
    Network Sniffer and Connection Analyzer
    查看>>
    NetworkX系列教程(11)-graph和其他数据格式转换
    查看>>
    Networkx读取军械调查-ITN综合传输网络?/读取GML文件
    查看>>
    Net与Flex入门
    查看>>
    net包之IPConn
    查看>>
    NFinal学习笔记 02—NFinalBuild
    查看>>
    NFS共享文件系统搭建
    查看>>
    nfs复习
    查看>>
    NFS网络文件系统
    查看>>
    nft文件传输_利用remoting实现文件传输-.NET教程,远程及网络应用
    查看>>
    ng 指令的自定义、使用
    查看>>
    nginx + etcd 动态负载均衡实践(二)—— 组件安装
    查看>>
    nginx + etcd 动态负载均衡实践(四)—— 基于confd实现
    查看>>
    Nginx + Spring Boot 实现负载均衡
    查看>>
    Nginx + uWSGI + Flask + Vhost
    查看>>
    Nginx - Header详解
    查看>>
    Nginx Location配置总结
    查看>>
    Nginx upstream性能优化
    查看>>
    Nginx 中解决跨域问题
    查看>>