1. 程式人生 > >712. 兩個字串的最小ASCII刪除和

712. 兩個字串的最小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]之間。

============================================================

解題思路,動態規劃問題

假設 s1的前i-1個元素和 s2的前j-1個元素達到相等所要刪除最小ascll和為 dp[i-1][j-1]

dp[ i ][ j ] 代表的就是  s1的前i個字元和s2前j個字元想要相等的最小ascll刪除和

那麼 假設 s1.charAt(i) == s2.charAt(j)

  • dp[i][j] = dp[i-1][j-1]

那麼 如果 s1.charAt(i) != s2.charAt(j)

  • dp[i][j] = min(dp[i-1][j]+s1.charAt(i) , dp[i][j-1]+s2.charAr(j))

我們要做的首先要初始化 

邊界問題:我們要初始化 dp[0][ j ] 和 dp[ i ][0]的情況

即如果s1或者s2有一個字串為空字串,最小刪除和為不為空字串字元ascll之和

以下是java程式碼實現

=============================================================

class Solution {
    public int minimumDeleteSum(String s1, String s2) {
        int len1 = s1.length(),
        len2=s2.length();
        int[][] dp = new int[len1+1][len2+1];
        for (int i = 1; i < len2+1; i++) {
            dp[0][i] = dp[0][i-1]+s2.charAt(i-1);
        }
        for (int i = 1; i < len1+1; i++) {
            dp[i][0] = dp[i-1][0]+s1.charAt(i-1);
            for (int j = 1; j < len2+1; j++) {
                if (s1.charAt(i-1)==s2.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1];
                }else{
                    dp[i][j]=Math
                .min(dp[i-1][j]+s1.charAt(i-1),dp[i][j-1]+s2.charAt(j-1));
                }
            }
        }
        return dp[len1][len2];
    }
}