min_cost_string_conversion.py
"""⏎
Algorithm for calculating the most cost-efficient sequence for converting one string into another.⏎
The only allowed operations are⏎
---Copy character with cost cC⏎
---Replace character with cost cR⏎
---Delete character with cost cD⏎
---Insert character with cost cI⏎
"""⏎
⏎
⏎
def compute_transform_tables(X, Y, cC, cR, cD, cI):⏎
X = list(X)⏎
Y = list(Y)⏎
m = len(X)⏎
n = len(Y)⏎
⏎
costs = [[0 for _ in range(n + 1)] for _ in range(m + 1)]⏎
ops = [[0 for _ in range(n + 1)] for _ in range(m + 1)]⏎
⏎
for i in range(1, m + 1):⏎
costs[i][0] = i * cD⏎
ops[i][0] = "D%c" % X[i - 1]⏎
⏎
for i in range(1, n + 1):⏎
costs[0][i] = i * cI⏎
ops[0][i] = "I%c" % Y[i - 1]⏎
⏎
for i in range(1, m + 1):⏎
for j in range(1, n + 1):⏎
if X[i - 1] == Y[j - 1]:⏎
costs[i][j] = costs[i - 1][j - 1] + cC⏎
ops[i][j] = "C%c" % X[i - 1]⏎
else:⏎
costs[i][j] = costs[i - 1][j - 1] + cR⏎
ops[i][j] = "R%c" % X[i - 1] + str(Y[j - 1])⏎
⏎
if costs[i - 1][j] + cD < costs[i][j]:⏎
costs[i][j] = costs[i - 1][j] + cD⏎
ops[i][j] = "D%c" % X[i - 1]⏎
⏎
if costs[i][j - 1] + cI < costs[i][j]:⏎
costs[i][j] = costs[i][j - 1] + cI⏎
ops[i][j] = "I%c" % Y[j - 1]⏎
⏎
return costs, ops⏎
⏎
⏎
def assemble_transformation(ops, i, j):⏎
if i == 0 and j == 0:⏎
seq = []⏎
return seq⏎
else:⏎
if ops[i][j][0] == "C" or ops[i][j][0] == "R":⏎
seq = assemble_transformation(ops, i - 1, j - 1)⏎
seq.append(ops[i][j])⏎
return seq⏎
elif ops[i][j][0] == "D":⏎
seq = assemble_transformation(ops, i - 1, j)⏎
seq.append(ops[i][j])⏎
return seq⏎
else:⏎
seq = assemble_transformation(ops, i, j - 1)⏎
seq.append(ops[i][j])⏎
return seq⏎
⏎
⏎
if __name__ == "__main__":⏎
_, operations = compute_transform_tables("Python", "Algorithms", -1, 1, 2, 2)⏎
⏎
m = len(operations)⏎
n = len(operations[0])⏎
sequence = assemble_transformation(operations, m - 1, n - 1)⏎
⏎
string = list("Python")⏎
i = 0⏎
cost = 0⏎
⏎
with open("min_cost.txt", "w") as file:⏎
for op in sequence:⏎
print("".join(string))⏎
⏎
if op[0] == "C":⏎
file.write("%-16s" % "Copy %c" % op[1])⏎
file.write("\t\t\t" + "".join(string))⏎
file.write("\r\n")⏎
⏎
cost -= 1⏎
elif op[0] == "R":⏎
string[i] = op[2]⏎
⏎
file.write("%-16s" % ("Replace %c" % op[1] + " with " + str(op[2])))⏎
file.write("\t\t" + "".join(string))⏎
file.write("\r\n")⏎
⏎
cost += 1⏎
elif op[0] == "D":⏎
string.pop(i)⏎
⏎
file.write("%-16s" % "Delete %c" % op[1])⏎
file.write("\t\t\t" + "".join(string))⏎
file.write("\r\n")⏎
⏎
cost += 2⏎
else:⏎
string.insert(i, op[1])⏎
⏎
file.write("%-16s" % "Insert %c" % op[1])⏎
file.write("\t\t\t" + "".join(string))⏎
file.write("\r\n")⏎
⏎
cost += 2⏎
⏎
i += 1⏎
⏎
print("".join(string))⏎
print("Cost: ", cost)⏎
⏎
file.write("\r\nMinimum cost: " + str(cost))⏎