参考博客:
http://blog.csdn.net/d87420572/article/details/17961485
http://blog.csdn.net/eraser567/article/details/50715746
http://blog.csdn.net/vonzhoufz/article/details/44627829
参考答案:
http://www.jiuzhang.com/solution/edit-distance
public class EditDistance {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public int minDistance(String word1, String word2) {
if(word1==null&&word2==null)
return 0;
char[] ch1=word1.toCharArray();
char[] ch2=word2.toCharArray();
int m=ch1.length+1;
int n=ch2.length+1;
int[][] dis=new int[m][n];
for(int j=0;j<n;j++){
dis[0][j]=j;
}
for(int i=0;i<m;i++){
dis[i][0]=i;
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(ch1[i-1]==ch2[j-1]){
dis[i][j]=dis[i-1][j-1];
}
else{
dis[i][j]=1+Math.min(dis[i-1][j], Math.min(dis[i][j-1],dis[i-1][j-1]));
}
}
}
return dis[m-1][n-1]; //特别要注意:前面数组的长度定义的是m和n,这里数组的某一个值的位置是m-1和n-1
}
}
变式:
/**
* @param args
* ic:插入代价
* dc:删除代价
* rc:替换代价
*/
public static int editCost(String s1, String s2, int ic, int dc, int rc){
int M=s1.length();
int N=s2.length();
char[] ch1=s1.toCharArray();
char[] ch2=s2.toCharArray();
int[][] dp = new int[M+1][N+1];
dp[0][0]=0;
for(int i=1;i<=M;i++){
dp[i][0]=dp[i-1][0]+dc;
}
for(int j=1;j<=N;j++){
dp[0][j]=dp[0][j-1]+ic;
}
for(int i=1;i<=M;i++){
for(int j=1;j<=N;j++){
dp[i][j]=Math.min(dp[i-1][j]+dc, dp[i][j-1]+ic);
if(ch1[i]==ch1[j]){
dp[i][j]=Math.min(dp[i][j],dp[i-1][j-1]);
}
else{
dp[i][j]=Math.min(dp[i][j],dp[i-1][j-1]+rc);
}
}
}
return dp[M][N];
}