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