Recurrence

int editDistance(String s, String t) {
  int n = s.length(), m = t.length();
  int[][] dp = new int[n + 1][m + 1];
  for (int i = 0; i <= n; i++) dp[i][0] = i;
  for (int j = 0; j <= m; j++) dp[0][j] = j;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      if (s.charAt(i-1) == t.charAt(j-1)) dp[i][j] = dp[i-1][j-1];
      else dp[i][j] = 1 + Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1]));
  return dp[n][m];
}
Advertisement

Space O(M)

Only previous row needed. Roll arrays.

Advertisement

Faster: Hirschberg

Divide-and-conquer edit alignment in O(N·M) time, O(M) space with reconstruction.

Sub-cubic

Masek-Paterson: O(N²/log N). Rarely practical constants.