这个题解的思路是先求出两个字符串的最长公共子序列(Longest Common Subsequence, LCS),然后计算出两个字符串所有字符的 ASCII 码值之和,最后用两个字符串的 ASCII 码值之和减去 2 倍 LCS 的 ASCII 码值之和,得到删除的最小 ASCII 码值之和。求 LCS 的过程使用了动态规划,dp[i][j] 表示 text1[:i] 和 text2[:j] 的 LCS 的 ASCII 码值之和。
时间复杂度: O(mn)
空间复杂度: O(mn)
class Solution:
def minimumDeleteSum(self, word1: str, word2: str) -> int:
def longestCommonSubsequence(text1, text2):
l1 = len(text1) + 1
l2 = len(text2) + 1
# 创建 dp 数组,dp[i][j] 表示 text1[:i] 和 text2[:j] 的 LCS 的 ASCII 码值之和
dp = [[0] * l1 for i in range(l2)]
text1 = list(text1)
text2 = list(text2)
for i in range(1, l2):
for j in range(1, l1):
if text1[j - 1] == text2[i - 1]:
# 如果当前字符相等,将其 ASCII 码值加到 dp[i][j] 中
dp[i][j] = dp[i - 1][j - 1] + ord(text1[j - 1])
else:
# 如果当前字符不相等,取 dp[i-1][j] 和 dp[i][j-1] 的最大值
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
# 返回 LCS 的 ASCII 码值之和
return dp[l2 - 1][l1 - 1]
# 计算 LCS 的 ASCII 码值之和
lcs = longestCommonSubsequence(word1, word2)
# 计算 word1 的 ASCII 码值之和
ord1 = 0
for s in word1:
ord1 += ord(s)
# 计算 word2 的 ASCII 码值之和
ord2 = 0
for s in word2:
ord2 += ord(s)
# 返回删除的最小 ASCII 码值之和
return ord1 + ord2 - 2 * lcs