在字符串处理的过程中,如何有效地将两个字符串转换为相同的形式是一个重要的问题。最小 ASCII 删除和问题提供了一种评估字符串相似性的有效方法,通过计算所需删除字符的 ASCII 值和,为我们提供了清晰的转换成本。本文将探讨这一问题的基本思路,并给出动态规划的实现方法,最后展示 Python 和 C++ 的具体代码。

最小 ASCII 删除和问题要求我们找出将两个字符串
和
转换为相同字符串所需删除的字符的最小 ASCII 值之和。换句话说,计算出为了使两个字符串相同,所需删除的字符的 ASCII 值的总和。
和
,我们可以定义 dp[i][j] 为将
的前
个字符和
的前 j个字符变为相同的最小 ASCII 删除和。
,那么不需要删除任何字符,
。
, 则有三种情况:
,代价为
。
,代价为
。
和
,代价为
1].
,大小为
,其中
和
分别是
和
的长度。
,表示将
的前
个字符转换为空字符串所需删除的 ASCII 值之和。
,表示将
的前
个字符转换为空字符串所需删除的 ASCII 值之和。
。
通过空间优化,降低内存占用的同时保持时间复杂度为
,适合中等规模的字符串比较。
以上就是两个字符串的最小ASCII删除和问题的基本思路。
class Solution:
def minimumDeleteSum(self, s1: str, s2: str) -> int:
m, n = len(s1), len(s2)
# 创建dp数组
dp = [[0] * (n + 1) for _ in range(m + 1)]
# 初始化边界条件
for i in range(1, m + 1):
dp[i][0] = dp[i - 1][0] + ord(s1[i - 1]) # 删除s1的字符
for j in range(1, n + 1):
dp[0][j] = dp[0][j - 1] + ord(s2[j - 1]) # 删除s2的字符
# 填充dp数组
for i in range(1, m + 1):
for j in range(1, n + 1):
if s1[i - 1] == s2[j - 1]:
dp[i][j] = dp[i - 1][j - 1] # 字符相同
else:
dp[i][j] = min(dp[i - 1][j] + ord(s1[i - 1]), # 删除s1的字符
dp[i][j - 1] + ord(s2[j - 1]), # 删除s2的字符
dp[i - 1][j - 1] + ord(s1[i - 1]) + ord(s2[j - 1])) # 同时删除
# 返回最小ASCII删除和
return dp[m][n]dp 数组并设置边界条件,分别表示将 s1 和 s2 转换为空字符串的操作。dp[m][n],即将 s1 转换为 s2 所需的最小 ASCII 删除和。class Solution {
public:
int minimumDeleteSum(string s1, string s2) {
int m = s1.size(), n = s2.size();
// 创建dp数组
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
// 初始化边界条件
for (int i = 1; i <= m; i++) {
dp[i][0] = dp[i - 1][0] + s1[i - 1]; // 删除s1的字符
}
for (int j = 1; j <= n; j++) {
dp[0][j] = dp[0][j - 1] + s2[j - 1]; // 删除s2的字符
}
// 填充dp数组
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (s1[i - 1] == s2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1]; // 字符相同
} else {
dp[i][j] = min({dp[i - 1][j] + s1[i - 1], // 删除s1的字符
dp[i][j - 1] + s2[j - 1], // 删除s2的字符
dp[i - 1][j - 1] + s1[i - 1] + s2[j - 1]}); // 同时删除
}
}
}
// 返回最小ASCII删除和
return dp[m][n];
}
};dp 数组并设置边界条件,分别表示将 s1 和 s2 转换为空字符串的操作。dp[m][n],即将 s1 转换为 s2 所需的最小 ASCII 删除和。