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


          

      题目的描述为:将一个字符串变成另一个字符串,方式为添加一个字符,删除一个字符,替换一个字符,求这些操作的做小次数,例如字符串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

  • 相关阅读:
    【BZOJ3218】 a+b Problem
    【BZOJ3993】 星际战争
    【BZOJ3991】 寻宝游戏
    【BZOJ2959】长跑 (LCT+并查集)
    NOIP2017记
    【CF 678F】Lena and Queries
    【Learning】多项式乘法与快速傅里叶变换(FFT)
    Subsequence Count (线段树)
    【留言板】
    【bzoj 4173】数学
  • 原文地址:https://www.cnblogs.com/cwb123/p/12739539.html
Copyright © 2020-2023  润新知