-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathminimum-cost-good-caption.py
38 lines (37 loc) · 1.26 KB
/
minimum-cost-good-caption.py
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
# Time: O(26 * n)
# Space: O(26 * n)
# dp, backtracing
class Solution(object):
def minCostGoodCaption(self, caption):
"""
:type caption: str
:rtype: str
"""
L = 3
n = len(caption)
if n < L:
return ""
dp = [[[0]*2 for _ in xrange(26)] for _ in xrange(n-L+1)]
mn = [[0]*2 for _ in xrange(n-L+1)]
cap = map(lambda x: ord(x)-ord('a'), caption)
for i in reversed(xrange(n-L+1)):
for j in xrange(26):
if i == n-L:
dp[i][j][:] = [sum(abs(cap[k]-j) for k in xrange(i, i+L)), L]
continue
dp[i][j][:] = [dp[i+1][j][0]+abs(cap[i]-j), 1]
if i+L < n-2:
curr, c = mn[i+L]
curr += sum(abs(cap[k]-j) for k in xrange(i, i+L))
if curr < dp[i][j][0] or (curr == dp[i][j][0] and c < j):
dp[i][j][:] = [curr, L]
mn[i] = min([dp[i][j][0], j] for j in xrange(26))
result = []
i, j, l = 0, mn[0][1], 1
while i != n:
if l == L:
j = mn[i][1]
l = dp[i][j][1]
result.append(chr(ord('a')+j)*l)
i += l
return "".join(result)