计算两个字符串的距离算法

      

  题目的描述为:将一个字符串变成另一个字符串,方式为添加一个字符,删除一个字符,替换一个字符,求这些操作的做小次数,例如字符串db adcb 两个字符串,通过添加a和c两个字符奖db编辑成adcb,这个两个字符串的距离为2

  思路:定义一个二维代价数组dp[n][m],设添加一个字符的代价为 ic(inseret cost),删除一个字符的代价为dc(delect cost),替换一个字符的代价为rc(replace cost) dp[n][m]为下列三种情况中的最小值

1,dp[x][y] = dp[x][y-1]+ic

表示 已知 A字符串中前x个字符表示B中前y-1个字符的代价已知,求A中前x个字符表示B中前y个字符的代价为dp[x][y-1]+ic;

2,dp[x][y]=dp[x-1][y]+dc;

表示已知A中前x-1个字符表示B中前y个字符的代价,则使用A中前x个字符表示B中前y个字符的代价为dp[x-1][y]+dc;

3,dp[x][y]=dp[x-1][y-1];

表示已知A中前x-1个字符表示B中前y-1个字符代价dp[x-1][y-1],当A中的第x字符等于B中第y个字符的时候,则A中前x个字符表示B中前y个字符的代价为dp[x-1][y-1]

4,dp[x][y]=dp[x-1][y-1]+rc

表示已知A中前x-1个字符表时B中前y-1个字符的代价为dp[x-1][y-1],当A中的第x个字符不等于B中第y个字符时,A中前x个字符表示B中的前y个字符的代价为dp[x-1][y-1]+rc;

代码如下:

public class demo {
 public static int strEditCost(String A,String B,int ic,int dc,int rc)
 {
  int c1,c2,c3;
  int n = A.length();
  int m = B.length();
  int dp[][] = new int[n+1][m+1];
  int x,y;
  for(x = 1;x<=n;x++)dp[x][0] = dc*x;
  for(y = 1;y<=m;y++)dp[0][y] = ic*y;
  for(x=1;x<=n;x++)
  {
   for(y=1;y<=m;y++)
   {
    c1 = dp[x][y-1]+ic;
    c2 = dp[x-1][y]+dc;
    c3=0;
    if(A.charAt(x-1)==B.charAt(y-1))
    {
     c3 = dp[x-1][y-1];
    }else {
     c3 = dp[x-1][y-1]+rc;
    }
    dp[x][y]=Math.min(c1, c2);
    dp[x][y]=Math.min(dp[x][y], c3);
   }
  }
 return dp[n][m];
 }
 public static void main(String[] args)
 {
  Scanner in = new Scanner(System.in);
  while(in.hasNext())
  {
   String A = in.next();
   String B = in.next();
   int ic = 1;
   int dc = 1;
   int rc = 1;
   int temp = strEditCost(A,B,ic,dc,rc);
   System.out.println(temp);
  }
 }
}

参考连接:https://www.nowcoder.com/questionTerminal/3959837097c7413a961a135d7104c314?orderByHotValue=0&done=0&pos=18&onlyReference=false

原文地址:https://www.cnblogs.com/cwb123/p/12739539.html