#!/usr/bin/perl use strict; use warnings; my @s = split //, $ARGV[0]; my @t = split //, $ARGV[1]; my ($m, $n) = ($#s + 1, $#t + 1); my @d; sub min { my ($a, $b, $c) = @_; return ($a < $b ? ($a < $c ? $a : $c) : ($b < $c ? $b : $c)); } sub edit { my ($i, $j) = @_; if ($d[$i][$j] != -1) { return $d[$i][$j]; } if ($s[$i - 1] eq $t[$j - 1]) { $d[$i][$j] = edit($i - 1, $j - 1); } else { $d[$i][$j] = 1 + min(edit($i - 1, $j - 1), edit($i - 1, $j), edit($i, $j - 1)); } return $d[$i][$j]; } for (my $i = 0; $i <= $m; ++$i) { for (my $j = 0; $j <= $n; ++$j) { $d[$i][$j] = -1; } } for (my $i = 0; $i <= $m; ++$i) { $d[$i][0] = $i; } for (my $j = 0; $j <= $n; ++$j) { $d[0][$j] = $j; } print &edit($m, $n), "\n";