712. 兩個字串的最小ASCII刪除和
阿新 • • 發佈:2018-11-19
給定兩個字串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];
}
}