问题描述
小U 和 小R 各自拥有一个长度相等的二进制字符串 A
和 B
。现在,他们想要将这两个字符串修改成相同的字符串。每次修改可以选择以下两种操作:
- 交换同一个字符串中的任意两个字符,交换操作的成本为它们索引之差的绝对值
|i - j|
。 - 对某个字符进行取反操作,取反的成本为 2。
小U 和 小R 想知道,将字符串 A
和 B
修改为相同字符串的最小总成本是多少?
代码
def solution(str1, str2):
# Edit your code here
assert len(str1) == len(str2)
dp = [0] * (len(str1) + 1)
for i in range(1, len(str1) + 1):
# Flip i, no swap
dp[i] = dp[i - 1] + (0 if str1[i - 1] == str2[i - 1] else 2)
# Enumerate all 3 swaps
if str1[i - 1] != str2[i - 1]:
for j in range(i - 1, max(i - 4, 0), -1):
if str1[i - 1] == str2[j - 1] and str2[j - 1] != str1[j - 1]:
inner_cost = 0
# Flip in between
if i - j == 2:
inner_cost += 2 if str1[i - 2] != str2[i - 2] else 0
if i - j == 3:
x, y = i - 2, i - 3
# Swap in between
if str1[x] == str2[y] and str1[y] == str2[x] and str1[x] != str2[x]:
inner_cost += 1
else:
# Flip in between
inner_cost += (2 if str1[x] != str2[x] else 0) + (2 if str1[y] != str2[y] else 0)
dp[i] = min(dp[j - 1] + (i - j) + inner_cost, dp[i])
return dp[len(str1)]
if __name__ == "__main__":
# Add your test cases here
print(solution("10001", "10000") == 2)
print(solution("100100", "100001") == 2)
print(solution("1010", "0011") == 3)
print(solution("1100", "0011") == 4)