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