您的位置:首页 > 其它

最小编辑代价

2017-12-14 10:55 351 查看


//最小编辑代价
public class MinPrice{

//经典的动态规划解法(时间复杂度为O(M*N),额外的空间复杂度为O(M*N))
public static int minCost01(String str1,String str2,int ic,int dc,int rc)
{

if(str1==null||str2==null)
{
return 0;
}
//将字符串转换成数组
char[]ch1=str1.toCharArray();
char[]ch2=str2.toCharArray();
int row=ch1.length+1;
int col=ch2.length+1;
//构造动态规划表
int[][]dp=new int[row][col];

for(int i=1;i<row;i++)
{
dp[i][0]=dc*i;
}
for(int j=1;j<col;j++)
{
dp[0][j]=ic*j;
}
for(int i=1;i<row;i++)
{
for(int j=1;j<col;j++)
{

//四种情况
if(ch1[i-1]==ch2[j-1])
{
dp[i][j]=dp[i-1][j-1];
}else{
dp[i][i]=dp[i-1][j-1]+rc;
}
dp[i][j]=Math.min(dp[i][j],dp[i][j-1]+ic);
dp[i][j]=Math.min(dp[i][j],dp[i-1][j]+dc);
}
}
return dp[row-1][col-1];

}

//压缩空间的动态规划(滚动法)(时间复杂度为O(M*N),额外的空间复杂度为O(min(M,N))
public static int minCost02(String str1,String str2,int ic,int dc,int rc)
{
if(str1==null||str2==null)
{
return 0;
}
char[]ch1=str1.toCharArray();
char[]ch2=str2.toCharArray();
char[]longs=ch1.length>=ch2.length?ch1:ch2;
char[]shorts=ch1.length<ch2.length?ch1:ch2;
//str2较长就交换ic和dc的值
if(ch1.length<ch2.length)
{
int temp=ic;
ic=dc;
dc=temp;
}
int[]dp=new int[shorts.length+1];
for(int i=1;i<=shorts.length;i++)
{
dp[i]=ic*i;
}
for(int i=1;i<=longs.length;i++)
{ //pre表示左上角的值
int pre=dp[0];
dp[0]=dc*i;
for(int j=1;j<=shorts.length;j++)
{
int temp=dp[j];
if(longs[i-1]==shorts[j-1])
{
dp[j]=pre;
}else{
dp[j]=pre+rc;
}
dp[j]=Math.min(dp[j],dp[j-1]+ic);
dp[j]=Math.min(dp[j],temp+dc);
pre=temp;

}
}
return dp[shorts.length];
}
public static void main(String[]args)
{
String str1="abc";
String str2="adc";
//经典动态规划法
System.out.println(minCost01(str1,str2,5,3,2));
//压缩空间滚动法
System.out.println(minCost02(str1,str2,5,3,2));

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息