package com.swabunga.spell.engine; import java.io.BufferedReader; import java.io.InputStreamReader; /** JMH Again, there is no need to have a global class matrix variable * in this class. I have removed it and made the getDistance static final */ public class EditDistance { public static Configuration config = Configuration.getConfiguration(); public static final int getDistance(String word, String similar) { int a_size = word.length() + 1; int b_size = similar.length() + 1; int[][] matrix = new int[a_size][b_size]; matrix[0][0] = 0; for (int j = 1; j != b_size; ++j) matrix[0][j] = matrix[0][j - 1] + config.getInteger(Configuration.EDIT_DEL1); word = " " + word; similar = " " + similar; int te; for (int i = 1; i != a_size; ++i) { matrix[i][0] = matrix[i - 1][0] + config.getInteger(Configuration.EDIT_DEL2); for (int j = 1; j != b_size; ++j) { if (word.charAt(i) == similar.charAt(j)) { matrix[i][j] = matrix[i - 1][j - 1]; } else { matrix[i][j] = config.getInteger(Configuration.EDIT_SUB) + matrix[i - 1][j - 1]; if (i != 1 && j != 1 && word.charAt(i) == similar.charAt(j - 1) && word.charAt(i - 1) == similar.charAt(j)) { te = config.getInteger(Configuration.EDIT_SWAP) + matrix[i - 2][j - 2]; if (te < matrix[i][j]) matrix[i][j] = te; } te = config.getInteger(Configuration.EDIT_DEL1) + matrix[i - 1][j]; if (te < matrix[i][j]) matrix[i][j] = te; te = config.getInteger(Configuration.EDIT_DEL2) + matrix[i][j - 1]; if (te < matrix[i][j]) matrix[i][j] = te; } } } return matrix[a_size - 1][b_size - 1]; } public static void main(String[] args) throws Exception { EditDistance ed = new EditDistance(); BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); String input = ""; String input2 = ""; while (input != null) { input = stdin.readLine(); input2 = stdin.readLine(); System.out.println(ed.getDistance(input, input2)); } } }