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