UNB/ CS/ David Bremner/ teaching/ cs3383/ lectures/ 32.1-demos/ edit-dist.py
#!/usr/bin/env python3
def dist(x,y):
  n = len(x); m=len(y)
  E = [ [max(i,j) for j in range(m+1)]
        for i in range(n+1) ]
  for i in range(1,n+1):
    for j in range(1,m+1):
      diff = int(x[i-1] != y[j-1])
      E[i][j] = min(E[i-1][j-1]+diff,
                    E[i-1][j]+1,
                    E[i][j-1]+1)
  return E

def trace(E,x,y,i,j):
  if (i<1):
    return "i" * j;
  elif (j<1):
    return "d" * i;
  elif x[i-1] == y[j-1]:
    return trace(E,x,y,i-1,j-1)+"."
  elif E[i][j] == E[i-1][j-1] + 1:
    return trace(E,x,y,i-1,j-1)+"s"
  elif E[i][j] ==  E[i-1][j]+1:
    return trace(E,x,y,i-1,j)+ "d"
  else:
    return trace(E,x,y,i,j-1)+ "i"

if __name__ == "__main__":

  x = "EXPONENTIAL"
  y = "POLYNOMIAL"
  n = len(x)
  m = len(y)

  E = dist(x,y)

  print("edit dist=",E[n][m])
  print("edits=",trace(E,x,y,n,m))