Here's a (slightly verified) version of the code that does what you requested. You can easily go through the result in parallel with the inputs to find the insert and delete.
public class StringDiff { private static int length(String s) { return s == null ? 0 : s.length(); } private static char[] chars(String s) { return s == null ? new char[0] : s.toCharArray(); } private final String left; private final String right; private final char[] lccs; private final String lcs; public StringDiff(String left, String right) { this.left = left; this.right = right; lccs = init(); lcs = new String(lccs); } public String getLcs() { return lcs; } public char[] getLccs() { return lccs.clone(); } private char[] init() { int lLength = length(left); int rLength = length(right); char[] lChars = chars(left); char[] rChars = chars(right); int [][] t = new int [lLength + 1][rLength + 1]; for (int i = lLength - 1; i >= 0; --i) { for (int j = rLength - 1; j >= 0; --j) { if (lChars[i] == rChars[j]) { t[i][j] = t[i + 1][j + 1] + 1; } else { t[i][j] = Math.max(t[i + 1][j], t[i][j + 1]); } } } char[] result = new char[t[0][0]]; int l = 0, r = 0, p = 0; while (l < lLength && r < rLength) { if (lChars[l] == rChars[r]) { result[p++] = lChars[l++]; r++; } else { if (t[l + 1][r] > t[l][r + 1]) { ++l; } else { ++r; } } } return result; } }
Accordingly, the longest subsequence of your source inputs:
The quick brown fox jumped over the lazy dog. The quick yellow fox jumped over the well-bred dog.
is an:
The quick ow fox jumped over the l dog.
(because "brown" and "yellow" have a "common", etc.)
It is relatively simple to change the above separation into spaces (instead of char arrays) and replace String # equals for == to get a version that finds the longest common subsequence of words instead of characters. For your example above, this change will lead to an obvious result:
found 7 words 'The' 'quick' 'fox' 'jumped' 'over' 'the' 'dog.'
(Your question involves comparing characters as you match spaces between words.)
joel.neely Jan 26 '09 at 13:17 2009-01-26 13:17
source share