@@ -19,74 +19,72 @@ class EditDistance:
19
19
"""
20
20
21
21
def __init__ (self ):
22
- self .__prepare__ ()
23
-
24
- def __prepare__ (self , n = 0 , m = 0 ):
25
- self .dp = [[- 1 for y in range (0 , m )] for x in range (0 , n )]
26
-
27
- def __solve_dp (self , x , y ):
28
- if x == - 1 :
29
- return y + 1
30
- elif y == - 1 :
31
- return x + 1
32
- elif self .dp [x ][y ] > - 1 :
33
- return self .dp [x ][y ]
22
+ self .word1 = ""
23
+ self .word2 = ""
24
+ self .dp = []
25
+
26
+ def __min_dist_top_down_dp (self , m : int , n : int ) -> int :
27
+ if m == - 1 :
28
+ return n + 1
29
+ elif n == - 1 :
30
+ return m + 1
31
+ elif self .dp [m ][n ] > - 1 :
32
+ return self .dp [m ][n ]
34
33
else :
35
- if self .a [ x ] == self .b [ y ]:
36
- self .dp [x ][ y ] = self .__solve_dp ( x - 1 , y - 1 )
34
+ if self .word1 [ m ] == self .word2 [ n ]:
35
+ self .dp [m ][ n ] = self .__min_dist_top_down_dp ( m - 1 , n - 1 )
37
36
else :
38
- self .dp [x ][y ] = 1 + min (
39
- self .__solve_dp (x , y - 1 ),
40
- self .__solve_dp (x - 1 , y ),
41
- self .__solve_dp (x - 1 , y - 1 ),
42
- )
43
-
44
- return self .dp [x ][y ]
45
-
46
- def solve (self , a , b ):
47
- if isinstance (a , bytes ):
48
- a = a .decode ("ascii" )
49
-
50
- if isinstance (b , bytes ):
51
- b = b .decode ("ascii" )
52
-
53
- self .a = str (a )
54
- self .b = str (b )
55
-
56
- self .__prepare__ (len (a ), len (b ))
57
-
58
- return self .__solve_dp (len (a ) - 1 , len (b ) - 1 )
59
-
60
-
61
- def min_distance_bottom_up (word1 : str , word2 : str ) -> int :
62
- """
63
- >>> min_distance_bottom_up("intention", "execution")
64
- 5
65
- >>> min_distance_bottom_up("intention", "")
66
- 9
67
- >>> min_distance_bottom_up("", "")
68
- 0
69
- """
70
- m = len (word1 )
71
- n = len (word2 )
72
- dp = [[0 for _ in range (n + 1 )] for _ in range (m + 1 )]
73
- for i in range (m + 1 ):
74
- for j in range (n + 1 ):
75
-
76
- if i == 0 : # first string is empty
77
- dp [i ][j ] = j
78
- elif j == 0 : # second string is empty
79
- dp [i ][j ] = i
80
- elif (
81
- word1 [i - 1 ] == word2 [j - 1 ]
82
- ): # last character of both substing is equal
83
- dp [i ][j ] = dp [i - 1 ][j - 1 ]
84
- else :
85
- insert = dp [i ][j - 1 ]
86
- delete = dp [i - 1 ][j ]
87
- replace = dp [i - 1 ][j - 1 ]
88
- dp [i ][j ] = 1 + min (insert , delete , replace )
89
- return dp [m ][n ]
37
+ insert = self .__min_dist_top_down_dp (m , n - 1 )
38
+ delete = self .__min_dist_top_down_dp (m - 1 , n )
39
+ replace = self .__min_dist_top_down_dp (m - 1 , n - 1 )
40
+ self .dp [m ][n ] = 1 + min (insert , delete , replace )
41
+
42
+ return self .dp [m ][n ]
43
+
44
+ def min_dist_top_down (self , word1 : str , word2 : str ) -> int :
45
+ """
46
+ >>> EditDistance().min_dist_top_down("intention", "execution")
47
+ 5
48
+ >>> EditDistance().min_dist_top_down("intention", "")
49
+ 9
50
+ >>> EditDistance().min_dist_top_down("", "")
51
+ 0
52
+ """
53
+ self .word1 = word1
54
+ self .word2 = word2
55
+ self .dp = [[- 1 for _ in range (len (word2 ))] for _ in range (len (word1 ))]
56
+
57
+ return self .__min_dist_top_down_dp (len (word1 ) - 1 , len (word2 ) - 1 )
58
+
59
+ def min_dist_bottom_up (self , word1 : str , word2 : str ) -> int :
60
+ """
61
+ >>> EditDistance().min_dist_bottom_up("intention", "execution")
62
+ 5
63
+ >>> EditDistance().min_dist_bottom_up("intention", "")
64
+ 9
65
+ >>> EditDistance().min_dist_bottom_up("", "")
66
+ 0
67
+ """
68
+ self .word1 = word1
69
+ self .word2 = word2
70
+ m = len (word1 )
71
+ n = len (word2 )
72
+ self .dp = [[0 for _ in range (n + 1 )] for _ in range (m + 1 )]
73
+
74
+ for i in range (m + 1 ):
75
+ for j in range (n + 1 ):
76
+ if i == 0 : # first string is empty
77
+ self .dp [i ][j ] = j
78
+ elif j == 0 : # second string is empty
79
+ self .dp [i ][j ] = i
80
+ elif word1 [i - 1 ] == word2 [j - 1 ]: # last characters are equal
81
+ self .dp [i ][j ] = self .dp [i - 1 ][j - 1 ]
82
+ else :
83
+ insert = self .dp [i ][j - 1 ]
84
+ delete = self .dp [i - 1 ][j ]
85
+ replace = self .dp [i - 1 ][j - 1 ]
86
+ self .dp [i ][j ] = 1 + min (insert , delete , replace )
87
+ return self .dp [m ][n ]
90
88
91
89
92
90
if __name__ == "__main__" :
@@ -99,7 +97,7 @@ def min_distance_bottom_up(word1: str, word2: str) -> int:
99
97
S2 = input ("Enter the second string: " ).strip ()
100
98
101
99
print ()
102
- print (f"The minimum Edit Distance is: { solver .solve (S1 , S2 )} " )
103
- print (f"The minimum Edit Distance is: { min_distance_bottom_up (S1 , S2 )} " )
100
+ print (f"The minimum edit distance is: { solver .min_dist_top_down (S1 , S2 )} " )
101
+ print (f"The minimum edit distance is: { solver . min_dist_bottom_up (S1 , S2 )} " )
104
102
print ()
105
103
print ("*************** End of Testing Edit Distance DP Algorithm ***************" )
0 commit comments