計算兩個字符串的距離算法


 

      

  題目的描述為:將一個字符串變成另一個字符串,方式為添加一個字符,刪除一個字符,替換一個字符,求這些操作的做小次數,例如字符串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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM