#!/usr/bin/perl use strict; use warnings; my ($s, $t) = @ARGV; print &leven($s, $t) . "\n"; sub min { my $min = $_[0]; foreach my $i (@_) { $min = $i if ($i < $min); } return $min; } sub leven { my ($s, $t) = @_; my ($len_s, $len_t) = (length $s, length $t); return $len_s if ($len_t == 0); return $len_t if ($len_s == 0); my @d; for (my $i = 0; $i <= $len_s; ++$i) { for (my $j = 0; $j <= $len_t; ++$j) { $d[$i][$j] = 0; $d[0][$j] = $j; } $d[$i][0] = $i; } my @a_s = split //, $s; my @a_t = split //, $t; for (my $i = 1; $i <= $len_s; ++$i) { for (my $j = 1; $j <= $len_t; ++$j) { my $subst = ($a_s[$i - 1] eq $a_t[$j - 1]) ? 0 : 1; $d[$i][$j] = min($d[$i - 1][$j] + 1, $d[$i][$j - 1] + 1, $d[$i - 1][$j - 1] + $subst); } } return $d[$len_s][$len_t]; }