友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

712. 两个字符串的最小ASCII删除和

给定两个字符串 s1s2,返回 使两个字符串相等所需删除字符的 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",结果即为 100101101+101 = 403 。
如果改为将两个字符串转换为 "lee" 或 "eet",我们会得到 433 或 417 的结果,比答案更大。

提示:

  • 0 <= s1.length, s2.length <= 1000

  • s1s2 由小写英文字母组成

思路分析

动态规划!

从后向前,如果遇到相等字符串则向前移动,否则舍弃其中一个结尾,向前探索。

0712 10

0712 11

0712 12

  • 一刷(暴力破解)

  • 一刷(备忘录)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
 * 暴力破解 (63 / 93)
 *
 * @author D瓜哥 · https://www.diguage.com
 * @since 2026-05-24 22:36:43
 */
public int minimumDeleteSum(String s1, String s2) {
  char[] sc1 = s1.toCharArray();
  char[] sc2 = s2.toCharArray();
  return dfs(sc1, sc1.length - 1, sc2, sc2.length - 1);
}

private int dfs(char[] a, int ai, char[] b, int bi) {
  if (ai < 0) {
    return sum(b, bi);
  }
  if (bi < 0) {
    return sum(a, ai);
  }
  if (a[ai] == b[bi]) {
    return dfs(a, ai - 1, b, bi - 1);
  } else {
    return Math.min(dfs(a, ai - 1, b, bi) + (int) a[ai],
      dfs(a, ai, b, bi - 1) + (int) b[bi]);
  }
}

private int sum(char[] a, int ai) {
  int result = 0;
  for (int i = 0; i <= ai; i++) {
    result += a[i];
  }
  return result;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
 * 暴力破解 (63 / 93)
 *
 * @author D瓜哥 · https://www.diguage.com
 * @since 2026-05-24 22:36:43
 */
public int minimumDeleteSum(String s1, String s2) {
  char[] sc1 = s1.toCharArray();
  char[] sc2 = s2.toCharArray();
  return dfs(sc1, sc1.length - 1, sc2, sc2.length - 1);
}

private int dfs(char[] a, int ai, char[] b, int bi) {
  if (ai < 0) {
    return sum(b, bi);
  }
  if (bi < 0) {
    return sum(a, ai);
  }
  if (a[ai] == b[bi]) {
    return dfs(a, ai - 1, b, bi - 1);
  } else {
    return Math.min(dfs(a, ai - 1, b, bi) + (int) a[ai],
      dfs(a, ai, b, bi - 1) + (int) b[bi]);
  }
}

private int sum(char[] a, int ai) {
  int result = 0;
  for (int i = 0; i <= ai; i++) {
    result += a[i];
  }
  return result;
}