Skip to content

Commit aee193e

Browse files
committed
Small fixes, proper example
1 parent bd49707 commit aee193e

File tree

2 files changed

+19
-25
lines changed

2 files changed

+19
-25
lines changed

src/main/java/info/debatty/java/stringsimilarity/OptimalStringAlignment.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,24 +51,27 @@ public final class OptimalStringAlignment implements StringDistance {
5151
* @return the OSA distance
5252
*/
5353
public final double distance(final String s1, final String s2) {
54+
int n = s1.length(), m = s2.length();
55+
if (n == 0) return m;
56+
if (m == 0) return n;
57+
5458

5559
// Create the distance matrix H[0 .. s1.length+1][0 .. s2.length+1]
5660
int[][] d = new int[s1.length() + 2][s2.length() + 2];
5761

58-
//@TODO: check special cases
5962
//initialize top row and leftmost column
60-
for (int i = 0; i <= s1.length(); i++) {
63+
for (int i = 0; i <= n; i++) {
6164
d[i][0] = i;
6265
}
63-
for (int j = 0; j <= s2.length(); j++) {
66+
for (int j = 0; j <= m; j++) {
6467
d[0][j] = j;
6568
}
6669

6770
//fill the distance matrix
6871
int cost;
6972

70-
for (int i = 1; i <= s1.length(); i++) {
71-
for (int j = 1; j <= s2.length(); j++) {
73+
for (int i = 1; i <= n; i++) {
74+
for (int j = 1; j <= m; j++) {
7275

7376
//if s1[i - 1] = s2[j - 1] then cost = 0, else cost = 1
7477
cost = (s1.charAt(i - 1) == s2.charAt(j - 1)) ? 0 : 1;
@@ -77,16 +80,19 @@ public final double distance(final String s1, final String s2) {
7780
d[i - 1][j - 1] + cost, // substitution
7881
d[i][j - 1] + 1, // insertion
7982
d[i - 1][j] + 1 // deletion
80-
);
81-
83+
);
84+
8285
//transposition check
83-
if (i > 1 && j > 1 && s1.charAt(i-1) == s2.charAt(j-2) && s1.charAt(i-2) == s2.charAt(j-1)){
84-
d[i][j] = Math.min(d[i][j], d[i-2][j-2] + cost);
86+
if (i > 1 && j > 1
87+
&& s1.charAt(i - 1) == s2.charAt(j - 2)
88+
&& s1.charAt(i - 2) == s2.charAt(j - 1)
89+
){
90+
d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost);
8591
}
8692
}
8793
}
8894

89-
return d[s1.length() + 1][s2.length() + 1];
95+
return d[n][m];
9096
}
9197

9298
private static int min(

src/main/java/info/debatty/java/stringsimilarity/examples/Examples.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -122,21 +122,9 @@ public static void main(String[] args) {
122122
System.out.println("\nOptimal String Alignment");
123123
OptimalStringAlignment osa = new OptimalStringAlignment();
124124

125-
// 1 substitution
126-
System.out.println(osa.distance("ABCDEF", "ABDCEF"));
127-
128-
// 2 substitutions
129-
System.out.println(osa.distance("ABCDEF", "BACDFE"));
130-
131-
// 1 deletion
132-
System.out.println(osa.distance("ABCDEF", "ABCDE"));
133-
System.out.println(osa.distance("ABCDEF", "BCDEF"));
134-
135-
System.out.println(osa.distance("ABCDEF", "ABCGDEF"));
136-
137-
// All different
138-
System.out.println(osa.distance("ABCDEF", "POIU"));
139-
125+
System.out.println(osa.distance("CA", "ABC"));
126+
127+
140128
// Longest Common Subsequence
141129
// ==========================
142130
System.out.println("\nLongest Common Subsequence");

0 commit comments

Comments
 (0)