Edit Distance

来源:互联网 发布:云熙拆单软件正版价格 编辑:程序博客网 时间:2024/05/16 06:18

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

思路:这个题目和http://blog.csdn.net/lmy690858904/article/details/47971639其实是大致一样的,只不过这个题目从word1变换为word2有三种操作方法(插入,删除,替换),而distinct subsequences中,从字符串S变换成字符串T只能删除字符。

同样,我们用d[i][j]表示word1中前i个字符变换为word2中前j个字符所用的最小步数。
计算d[i][j]的值,为以下三种情况中最小的一个值

  1. d[i-1][j]+1 表示word1中的第i个位置删除第i个字符,因为S中前i-1个字符已经可以变换成T中的前j个字符了

  2. d[i][j-1]+1 表示在word1中第i个位置插入T中的第j个字符

  3. d[i-1][j-1]+isreplace ,如果word1[i]==word2[j] ,isreplace=0,表示不用进行替换操作。否则word1[i]!=word[j], isreplace=1,表示需要进行替换操作。

那么 d[i][j]=Math.min(Math.min(d[i-1][j],d[i][j-1])+1,d[i-1][j-1]+isreplace);

注意:当d[i][j]中i表示已经遍历到S中的第i个字符了,j表示已经遍历到T中的第j个字符了的时候,此时计算isreplace的时候,因为word1和word2的下标都是从0开始的,所以有 isreplace=(word1.charAt(i-1)==word2.charAt(j-1) ? 0 : 1);

public class Solution {    public int minDistance(String word1, String word2) {        int m=word1.length();        int n=word2.length();        int isreplace=0;        int[][] d=new int[m+1][n+1];         d[0][0]=0;        for(int i=1;i<=m;i++)          d[i][0]=i;        for(int j=1;j<=n;j++)          d[0][j]=j;        for(int i=1;i<=m;i++)        {  for(int j=1;j<=n;j++)           {               isreplace=(word1.charAt(i-1)==word2.charAt(j-1) ? 0 : 1);               d[i][j]=Math.min(Math.min(d[i-1][j],d[i][j-1])+1,d[i-1][j-1]+isreplace);           }        }        return d[m][n];    }}
0 0
原创粉丝点击