zoukankan      html  css  js  c++  java
  • 两个字符串的最小ASCII删除和

    给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和。

    示例 1:

    输入: s1 = "sea", s2 = "eat"
    输出: 231
    解释: 在 "sea" 中删除 "s" 并将 "s" 的值(115)加入总和。
    在 "eat" 中删除 "t" 并将 116 加入总和。
    结束时,两个字符串相等,115 + 116 = 231 就是符合条件的最小和。
    

    示例 2:

    输入: s1 = "delete", s2 = "leet"
    输出: 403
    解释: 在 "delete" 中删除 "dee" 字符串变成 "let",
    将 100[d]+101[e]+101[e] 加入总和。在 "leet" 中删除 "e" 将 101[e] 加入总和。
    结束时,两个字符串都等于 "let",结果即为 100+101+101+101 = 403 。
    如果改为将两个字符串转换为 "lee" 或 "eet",我们会得到 433 或 417 的结果,比答案更大。
    

    注意:

    • 0 < s1.length, s2.length <= 1000
    • 所有字符串中的字符ASCII值在[97, 122]之间

    思想:典型的求字符串最优解问题,一般都是使用动态规划法。dp[i][j]表示字符串1前i个字符,字符串2前j个字符达到完全一致需要删除的最少ASCII和。状态转移方程:

    如果s1.charA(i - 1) == s2.charAt(j - 1), dp[i][j] = dp[i - 1][j - 1];
    否则dp[i][j] = min(dp[i][j - 1] + s2.charAt(j - 1), dp[i - 1][j] +s1.charA(i - 1);//dp[i][j - 1] + s2.charAt(j - 1)代表删除字符串2中的第j个字符去匹配字符串1的前i个字符,dp[i - 1][j] +s1.charA(i - 1) 代表删除字符串1的第i个字符去匹配字符串2的前j个字符

    代码如下:

    public int minimumDeleteSum(String s1, String s2) {
            int l1 = s1.length();
            int l2 = s2.length();
            int[][] dp = new int[l1+1][l2+1];        
         for(int i = 1;i<=l1;i++){ for(int j = 1;j<=l2;j++){ if(i == 1) dp[0][j] = dp[0][j-1]+s2.charAt(j-1); if(j == 1) dp[i][0] = dp[i-1][0]+s1.charAt(i-1); if(s1.charAt(i-1) == s2.charAt(j-1)){ dp[i][j] = dp[i-1][j-1]; }else{ //保留时s2 int a = dp[i-1][j]+s1.charAt(i-1); //保留时s1 int b = dp[i][j-1]+s2.charAt(j-1); dp[i][j] = a<b?a:b; } } } return dp[l1][l2]; }
  • 相关阅读:
    线性代数思维导图——3.向量
    微分中值定理的基础题型总结
    构造函数
    Python课程笔记(七)
    0241. Different Ways to Add Parentheses (M)
    0014. Longest Common Prefix (E)
    0013. Roman to Integer (E)
    0011. Container With Most Water (M)
    0010. Regular Expression Matching (H)
    0012. Integer to Roman (M)
  • 原文地址:https://www.cnblogs.com/du001011/p/10909078.html
Copyright © 2011-2022 走看看