题目: 请实现如下接口

对于不同的字符串,我们希望能有办法的判断相似度,我们定义了一套操作方法,来把两个不相同的

的字符的变的相同,具体的操作方法如下:

1.修改的一个字符,入吧“a”替换成为“b”.

2.增加一个字符,入吧“abcd”变为“aebdb”.

3.删除一个字符,入吧“traveing”

 

import java.util.*;
import java.io.*;
/*
这道题其实简单的理解就是为了求字符串的最小编辑代价,也是一个经典的动态规划题,复杂度O(M*N)
思路:1.求解状态转移矩阵dp[M + 1][N + 1],dp[i][j] 的值代表的是str1[0...i-1]编辑为str2[0...j-1]
的最小代价。
2. 计算过程:
1)dp[0][0] = 0,表示str1空的字串编辑为str2空的字串代价为0。
2)矩阵dp第一列即为dp[0...M-1][0],dp[i][0] 表示str1[0...i-1]编辑为空串的最小代价,所以就是将str1[0..M-1]的字符删掉的代价
所以dp[i][0] = i;
3) 同2),那str2[0...j-1]编辑的代价,dp[0][j] = j;
4) 接下来的位置就按照从左到右,从上到下来计算,dp[i][j]的值来至于下面的几种情况:
(1)str1[0...i-1]可以先编辑为str1[0..i-2],也就是删除字符str1[i-1],然后由str1[0..i-2]编辑为str2[0...j-1],dp[i-1][j]表示str1[0..i-2]编辑为str2[0...j-1]的最小代价,
那么dp[i][j]可能等于dp[i -1][j] + 1;
(2)str1[0...i-1]可以先编辑为str1[0..i-2],然后将str2[0..j-2]插入字符str2[j-1],编辑成str2[0...j-1],dp[i][j-1]表示str1[0..i-1]编辑成str2[0...j-2]的最小代价,
那么dp[i][j] 可能等于dp[i][j-1] + 1;
(3) 如果str1[i - 1]!=str2[j-1] ,那么先把str1[0..i-1]中的str1[0..i-2]的部分边长str2[0..j-2],然后把字符str1[i-1]替换为str2[j-1],这样str1[0..i-1]就编辑成为str2[0...j-1]了,dp[i - 1][j - 1]表示
str1[0..i-2]编辑为str2[0..j-2]的最小代价,那么dp[i ][j]可能等于dp[i - 1][j - 1] + 1;
(4) 如果str1[i - 1]==str2[j-1] ,那么先把str1[0..i-1]中的str1[0..i-2]的部分边长str2[0..j-2],因为此时   str1[i - 1]==str2[j-1] ,所以str1[0..i-1]已经编辑为str2[0..j-1]了,dp[i - 1][j - 1]表示str1[0..i-2]编辑为str2[0..j-2]的最小代价, 那么dp[i ][j]可能等于dp[i - 1][j - 1]。
  
上述的4中情况取最小值,dp的最右下角就是最终结果,即最小编辑代价。
*/
public class Main {
    public static void main(String[] args) throws IOException {
                BufferedReader in = new BufferedReader(
                    new InputStreamReader(System.in)
                );
                String s1 = "";
                while ( null != (s1 = in.readLine())  ){
                //将两个输入字符串转为数组
                String s2=in.readLine();
                char[] cs1=s1.toCharArray();
                char[] cs2=s2.toCharArray();
                int[][] dp=new int[s1.length()+1][s2.length()+1];
                //用动态规划的方式获取一个数组变为另一个数组的步骤次数
                //初始化二维数组
                for(int row=1;row<=s1.length();row++){
                    dp[row][0]=row;
                }
                for(int col=1;col<=s2.length();col++){
                    dp[0][col]=col;
                }
                //动态规划
                for(int row=1;row<=s1.length();row++){
                    for(int col=1;col<=s2.length();col++){
                        if(cs1[row-1]==cs2[col-1]){
                            dp[row][col]=dp[row-1][col-1];
                        }
                        else{
                            int min1=Math.min(dp[row-1][col],dp[row][col-1])+1;
                            dp[row][col]=Math.min(min1,dp[row-1][col-1]+1);
   
                        }
                    }
                }
                System.out.println("1/"+ (dp[s1.length()][s2.length()]+1) );
            }
        }
    }
添加笔记
求解

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执于代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值