forked from TheAlgorithms/Python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmin_cost_string_conversion.py
123 lines (95 loc) · 3.44 KB
/
min_cost_string_conversion.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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from typing import List, Tuple
"""
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: str, Y: str, cC: int, cR: int, cD: int, cI: int
) -> Tuple[List[int], List[str]]:
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: List[str], i: int, j: int) -> List[str]:
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))