public static int editDistance(String s1, String s2) { 
   int i,j; 
   int sizeS1 = s1.length(); 
   int sizeS2 = s2.length(); 

   // Utworzenie macierzy edycji odległości. 
   int distances[][] = new int[sizeS1+1][sizeS2+1]; 

   // Inicjalizacja macierzy. 
   for (i=0; i<=sizeS1; i++) { 
      distances[i][0] = i; 
   } 
   for (j=0; j<=sizeS2; j++) { 
      distances[0][j] = j; 
   } 

   // Obliczenie edycji odległości. 
   for (i=1; i<=sizeS1; i++) { 
      for (j=1; j<=sizeS2; j++) { 
         if ( s1.charAt(i-1) == s2.charAt(j-1) ) { 
            // Nie jest wymagana żadna operacja, koszt pozostaje bez zmian.
            distances[i][j] = distances[i-1][j-1]; 
         } 
         else 
         { 
            // Obliczenie minimalnej edycji odległości na podstawie trzech 
            // operacji, które można wykonać na tym etapie: 
            distances[i][j] = Math.min ( 
               // Usunięcie S1[i].
               distances[i-1][j] + 1, 
               // Wstawienie S2[j]. 
               Math.min ( distances[i][j-1] + 1, 
               // Zastąpienie S1[i] dla S2[j].
               distances[i-1][j-1] + 1 ) ); 
         } 
      } 
   } 
   return distances[sizeS1][sizeS2]; 
}
