aboutsummaryrefslogtreecommitdiff
path: root/challenge-096/paulo-custodio/python/ch-2.py
blob: 66cafdbf04c06e95c26802f3fd56d26acffc4d55 (plain)
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
#!/usr/bin/env python

# Challenge 096
#
# TASK #2 > Edit Distance
# Submitted by: Mohammad S Anwar
# You are given two strings $S1 and $S2.
#
# Write a script to find out the minimum operations required to convert $S1
# into $S2. The operations can be insert, remove or replace a character. Please
# check out Wikipedia page for more information.
#
# Example 1:
# Input: $S1 = "kitten"; $S2 = "sitting"
# Output: 3
#
# Operation 1: replace 'k' with 's'
# Operation 2: replace 'e' with 'i'
# Operation 3: insert 'g' at the end
# Example 2:
# Input: $S1 = "sunday"; $S2 = "monday"
# Output: 2
#
# Operation 1: replace 's' with 'm'
# Operation 2: replace 'u' with 'o'

import sys

def wag_fis_dist(a, b):

    # define a table where d[i,j] is the Levenshtein distance between
    # first i chars of a and first j chars of b
    d = [ [ 0 for j in range(0, len(b)+1) ] for i in range(0, len(a)+1) ]

    # source prefixes can be transformed into empty string by dropping chars
    for i in range(1, len(a)+1):
        d[i][0] = i

    # target prefixes can be reached from empty source prefix by inserting chars
    for j in range(1, len(b)+1):
        d[0][j] = j

    # flood-fill the rest of the table
    for j in range(1, len(b)+1):
        for i in range(1, len(a)+1):
            subst_cost = 0 if a[i-1] == b[j-1] else 1
            d[i][j] = min(d[i-1][j]+1,              # deletion
                          d[i][j-1]+1,              # insertion
                          d[i-1][j-1]+subst_cost)   # substitution

    # distance is in lower bottom cell
    return d[len(a)][len(b)]

a, b = tuple(sys.argv[1:3])
print(wag_fis_dist(a, b))