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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| class Solution: def minimumDeleteSum(self, s1: str, s2: str) -> int: m, n = len(s1), len(s2) f = [0]*(n+1) for i, x in enumerate(s2): f[i+1] = f[i] + ord(x)
s = 0 for i in range(m): pre = s s += ord(s1[i]) f[0] = s for j in range(n): tmp = f[j+1] if s1[i] == s2[j]: f[j+1] = pre else: f[j+1] = min(f[j+1]+ord(s1[i]), f[j]+ord(s2[j])) pre = tmp return f[n] m, n = len(s1), len(s2) f = [[0]*(n+1) for _ in range(m+1)] for i, x in enumerate(s1): f[i+1][0] = f[i][0] + ord(x) for i, x in enumerate(s2): f[0][i+1] = f[0][i] + ord(x) for i in range(m): for j in range(n): if s1[i] == s2[j]: f[i+1][j+1] = f[i][j] else: f[i+1][j+1] = min(f[i][j+1]+ord(s1[i]), f[i+1][j]+ord(s2[j])) return f[m][n] @cache def dfs(i:int, j:int): if i < 0 or j < 0: if i < 0 and j < 0: return 0 if i < 0: return sum(ord(x) for x in s2[0:j+1]) if j < 0: return sum(ord(x) for x in s1[0:i+1]) if s1[i] == s2[j]: return dfs(i-1, j-1) return min(dfs(i-1, j) + ord(s1[i]), dfs(i, j-1) + ord(s2[j])) return dfs(len(s1)-1, len(s2)-1)
|