/**
* Utils primarily consists of some edit distance functions.
*/
package com.jaivox.interpreter;
import java.util.*;
import java.awt.Point;
public class Utils {
static String terms = " \t\r\n!@$#$%^&*()_-~`+={}[]|\\:;\"\'<>,.?/";
public Utils () {
}
public String [] splitTokens (String line) {
StringTokenizer st = new StringTokenizer (line, terms);
int n = st.countTokens ();
String qq [] = new String [n];
for (int i=0; i<n; i++) {
qq [i] = st.nextToken ();
}
return qq;
}
String makeString (String tokens []) {
StringBuffer sb = new StringBuffer ();
int n = tokens.length;
if (n == 0) return "";
sb.append (tokens [0]);
for (int i=1; i<n; i++) {
sb.append (" "+tokens [i]);
}
String result = new String (sb);
return result;
}
// http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Levenshtein_distance#Java
int minimum(int a, int b, int c) {
return Math.min (Math.min(a, b), c);
}
public int editDistance (String one, String two) {
int n = one.length ();
int m = two.length ();
int [][] distance = new int [n + 1][m + 1];
for (int i = 0; i <= n; i++)
distance [i][0] = i;
for (int j = 0; j <= m; j++)
distance [0][j] = j;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
distance [i][j] = minimum (
distance [i - 1][j] + 1,
distance [i][j - 1] + 1,
distance [i - 1][j - 1]
+ ((one.charAt (i - 1) == two.charAt (j - 1)) ? 0 : 1));
}
}
return distance [n][m];
}
public int approxMatch (String a, String b) {
String one [] = a.split (" ");
String two [] = b.split (" ");
int d = approxMatch (one, two);
return d;
}
int approxMatch (String one [], String two []) {
int n = one.length;
int m = two.length;
int [][] distance = new int [n + 1][m + 1];
for (int i = 0; i <= n; i++) {
distance [i][0] = i;
}
for (int j = 0; j <= m; j++) {
distance [0][j] = j;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
distance[i][j] = minimum (
distance[i-1][j] + 1,
distance[i][j-1] + 1,
distance[i-1][j-1] + (one[i-1].equals (two[j-1]) ? 0 : 1));
}
}
return distance [n][m];
}
static void quicksortpointy (Point p[], int low, int high) {
int lo = low;
int hi = high;
if (lo >= hi) {
return;
}
int mid = p[(lo + hi) / 2].y;
while (lo <= hi) {
while (lo < high && p[lo].y < mid) {
lo++;
}
while (hi > low && p[hi].y > mid) {
hi--;
}
if (lo <= hi) {
Point t;
t = p[lo];
p[lo] = p[hi];
p[hi] = t;
lo++;
hi--;
}
}
if (low < hi) {
quicksortpointy (p, low, hi);
}
if (lo < high) {
quicksortpointy (p, lo, high);
}
}
};