package com.interview.algorithms.dp; /** * Created_By: stefanie * Date: 14-9-20 * Time: 上午9:36 * Editing Distance: given two string A and B, could do the following actions to A to make it equals B: * Add a char, Delete a char, Modify a char. * Write code to find the minimal actions needed to make A equals B, as the Editing Distance of A and B. * * When scan to the i-th char in A and j-th char in B, it depends on the previous states. * if i-th char in A == j-th char in B: dis[i][j] = dis[i-1][j-1] * delete i-th char in A: dis[i][j] = dis[i-1][j] + 1; * delete j-th char in B: dis[i][j] = dis[i][j-1] + 1; * add j-th char in B to A: dis[i][j] = dis[i-1][j] + 1; * add i-th char in A to B: dis[i][j] = dis[i][j-1] + 1; * modify i-th char in A to j-th char in B: dis[i][j] = dis[i-1][j-1] + 1 * * so loop on i and j, and calculate to find the min action path. */ public class C12_24_EditingDistance { public static int distance(String a, String b){ int[][] dis = new int[a.length() + 1][b.length() + 1]; dis[0][0] = 0; for(int i = 1; i <= a.length(); i++) dis[i][0] = i; for(int i = 1; i <= b.length(); i++) dis[0][i] = i; for(int i = 1; i <= a.length(); i++){ for(int j = 1; j <= b.length(); j++){ dis[i][j] = a.charAt(i-1) == b.charAt(j-1)? dis[i-1][j-1] : dis[i-1][j-1] + 1; int ten = Math.min(dis[i-1][j], dis[i][j-1]) + 1; if(dis[i][j] > ten) dis[i][j] = ten; } } return dis[a.length()][b.length()]; } }