712. Minimum ASCII Delete Sum for Two Strings

题目:

Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal.

Example 1:

Input: s1 = "sea", s2 = "eat"
Output: 231
Explanation: Deleting "s" from "sea" adds the ASCII value of "s" (115) to the sum.
Deleting "t" from "eat" adds 116 to the sum.
At the end, both strings are equal, and 115 + 116 = 231 is the minimum sum possible to achieve this.

Example 2:

Input: s1 = "delete", s2 = "leet"
Output: 403
Explanation: Deleting "dee" from "delete" to turn the string into "let",
adds 100[d]+101[e]+101[e] to the sum.  Deleting "e" from "leet" adds 101[e] to the sum.
At the end, both strings are equal to "let", and the answer is 100+101+101+101 = 403.
If instead we turned both strings into "lee" or "eet", we would get answers of 433 or 417, which are higher.

Note:

  • 0 < s1.length, s2.length <= 1000.
  • All elements of each string will have an ASCII value in [97, 122].

思路:

这是一道典型的动态规划题目,建立二维数组dp,其中dp[i][j]表示字符串s1的前i个字符和字符串s2的前j个字符要变相等所需要删除的字符的最小ASCII码。

首先对dp进行初始化,当一个字符串为空时,另一个字符串需要删除全部的字符串才能保证两个字符串相等。

for (int i = 1; i <= (signed) s1.length(); i++) {
            dp[i][0] = dp[i - 1][0] + (int) s1[i - 1];
        }
        for (int i = 1; i <= (signed) s2.length(); i++)
            dp[0][i] = dp[0][i - 1] + (int) s2[i - 1];

对于dp[i][j],一共有3三种方法到达dp[i][j]

当s1[i-1] == s2[j-1]时,不需要删除s1[i-1]和s2[j-1]就可以保证两个字符串相等,此时dp[i][j] = dp[i-1][j-1]

当s1[i-1] != s2[j-1]时,dp[i][j]可以等于dp[i-1][j]+s1[i-1],也可以等于dp[i][j-1]+s2[j-1]。

  dp[i-1][j]+s1[i-1]表示由于从dp[i-1][j]到dp[i][j],增加了字符s1[i-1],s2的字符没有变。想要相同,就必须删除s1[i-1]。

  dp[i][j-1]+s2[j-1]表示由于从dp[i][j-1]到dp[i][j],增加了字符s2[j-1],s1的字符没有变。想要相同,就必须删除s2[j-1]。

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string>
 4 #include<vector>
 5 using namespace std;
 6 class Solution {
 7 public:
 8     int minimumDeleteSum(string s1, string s2) {
 9         //dp[i][j]代表s1的前i个字符与s2的前j个字符相等所需要删除的最小ascii码
10         int dp[s1.length() + 1][s2.length() + 1] = { 0 };
11         //初始化
12         for (int i = 1; i <= (signed) s1.length(); i++) {
13             dp[i][0] = dp[i - 1][0] + (int) s1[i - 1];
14         }
15         for (int i = 1; i <= (signed) s2.length(); i++)
16             dp[0][i] = dp[0][i - 1] + (int) s2[i - 1];
17
18         for (int i = 1; i <= (signed) s1.length(); i++) {
19             for (int j = 1; j <= (signed) s2.length(); j++) {
20                 //字符相等,不需要删除元素
21                 if (s1[i - 1] == s2[j - 1])
22                     dp[i][j] = dp[i - 1][j - 1];
23                 else {
26                     dp[i][j] = min(dp[i - 1][j] + (int) s1[i - 1],
27                             dp[i][j - 1] + (int) s2[j - 1]);
28                 }
29                 cout << dp[i][j] << " ";
30             }
31         }
32         cout << endl;
33         return dp[s1.length()][s2.length()];
34     }
35 };

举例:

以sea和eat为例。

当i=1,j=1时,dp[1][1] = min(dp[0][1]+s1[0],dp[1][0]+s2[0])  = e+s = 216

  dp[0][1]+s1[0]表示eat已经删除了e,sea需要删除s。

  dp[1][0]+s2[0]表示sea已经删除了s,eat需要删除e。

当i=1,j=2时,dp[1][2] = min(dp[0][2]+s2[0],dp[1][1]+s2[1]) = min(ea+s,se+a) = a+e+s = 313

  dp[0][2]+s2[0]表示eat已经删除了ea,sea需要删除s。

  dp[1][1]+s2[1]表示sea已经删除了s,eat已经删除了e,需要删除a。

当i=1,j=3时,dp[1][3] = min(dp[0][3]+s1[0],dp[1][2]+s2[2]) = min(eat+s,s+ea+t) = a+e+s+t = 429

  dp[0][3]+s1[0]表示eat已经删了eat,sea需要删除s。

  dp[1][2]+s2[2]表示sea已经删除了s,eat已经删除了ea,需要删除t。

当i=2,j=1时,dp[2][1] = dp[1][0] = 115

  由于s1[1]与s2[0]相同,只需要删除sea中的s。

当i = 2,j = 2时,dp[2][2] = min(dp[1][2]+s1[1],dp[2][1]+s2[1]) = a+s = 212

  dp[1][2]+s1[1]表示sea已经删除了s,eat已经删除了ea,sea还需要删除e。

  dp[2][1]+s2[1]表示sea已经删除了s,eat还需要删除a。

当i=2,j=3时,dp[2][3] = min(dp[1][3]+s1[1],dp[2][2]+s2[2]) = a+s+t = 328

  dp[1][3]+s1[1]表示sea已经删除了s,eat已经删除了eat,sea还需要删除e。

  dp[2][2]+s2[2]表示sea已经删除了s,eat已经删除了a,eat还需要删除t。

当i=3,j=1时,dp[3][1] = min(dp[2][1]+s1[2],dp[3][0]+s2[0]) = s+a = 212

  dp[2][1]+s1[2]表示sea已经删除了s,sea还需要删除a。

  dp[3][0]+s2[0]表示sea已经删除了sea,eat还需要删除a。

当i=3,j=2时,dp[3][2] = dp[2][1] = 115

当i=3,j=3时,dp[3][3] = min(dp[2][3]+s1[2],dp[3][2]+s2[2]) = s + t = 231

  dp[3][2]+s2[2]表示sea已经删除了s,eat还需要删除t。

原文地址:https://www.cnblogs.com/sindy/p/8449088.html

时间: 2024-10-03 05:19:39

712. Minimum ASCII Delete Sum for Two Strings的相关文章

LeetCode 712. Minimum ASCII Delete Sum for Two Strings

原题链接在这里:https://leetcode.com/problems/minimum-ascii-delete-sum-for-two-strings/ 题目: Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. Example 1: Input: s1 = "sea", s2 = "eat" Output: 2

[LeetCode] 583. Delete Operation for Two Strings 两个字符串的删除操作

Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in each step you can delete one character in either string. Example 1: Input: "sea", "eat" Output: 2 Explanation: You ne

[LeetCode] Minimum Size Subarray Sum 解题思路

Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, return 0 instead. For example, given the array [2,3,1,2,4,3] and s = 7,the subarray [4,3] has the minimal

leetcode_209题——Minimum Size Subarray Sum(两个指针)

Minimum Size Subarray Sum Total Accepted: 10318 Total Submissions: 44504My Submissions Question Solution Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, r

【LeetCode】209. Minimum Size Subarray Sum

Minimum Size Subarray Sum Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, return 0 instead. For example, given the array [2,3,1,2,4,3] and s = 7,the subar

583. Delete Operation for Two Strings

Problem statement: Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in each step you can delete one character in either string. Example 1: Input: "sea", "eat" Output: 2

[LeetCode] Delete Operation for Two Strings 两个字符串的删除操作

Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in each step you can delete one character in either string. Example 1: Input: "sea", "eat" Output: 2 Explanation: You ne

108th LeetCode Weekly Contest Minimum Falling Path Sum

Given a square array of integers A, we want the minimum sum of a falling path through A. A falling path starts at any element in the first row, and chooses one element from each row.  The next row's choice must be in a column that is different from t

[Swift Weekly Contest 108]LeetCode931. 下降路径最小和 | Minimum Falling Path Sum

Given a square array of integers A, we want the minimum sum of a falling path through A. A falling path starts at any element in the first row, and chooses one element from each row.  The next row's choice must be in a column that is different from t