sdasfagsgsfhh 2022-06-05 14:26 采纳率: 50%
浏览 42
已结题

关于#删除与替换#的问题,如何解决?

题目描述
小施和小唐两个同学近来对字符串操作很感兴趣。小施和小唐各自给了一个字符串,分别记作S和T。如果能通过魔法转换使小施的串和小唐的串变成同一个,那么他们两个人都会很开心。这里的魔法指的是小施的串可以任意删掉某个字符或者替换某个字符。通过这两种方式。如将401变为415,可通过将401中的1替换为5得405,然后将0替换为1得415,需2次修改。
现在给定长度至多为200的两个字符串S和T,你的任务是计算将字符串S变为字符串T的删除和替换的最少总次数。
输入
每组有2行,每行上有1个长度不超过200的字符串,字符串中不含空格。
输出
对输入中的每组测试数据,求出该组中第一行的字符串变为第二行的字符串B所需的删除与替换的最少总次数。
样例输入
输入样例1
32134
23
输入样例2
43010
4014
样例输出
输出样例1
3
输出样例2
2

  • 写回答

3条回答 默认 最新

  • 投三分的金闪闪 2022-06-05 15:11
    关注

    计算一个字符串变为另一个字符串的最少总次数,望采纳

    
    public int minDistance(String word1, String word2) {
            int n = word1.length();
            int m = word2.length();
    
            // 有一个字符串为空串
            if (n * m == 0) {
                return n + m;
            }
    
            // DP 数组
            int[][] D = new int[n + 1][m + 1];
    
            // 边界状态初始化
            for (int i = 0; i < n + 1; i++) {
                D[i][0] = i;
            }
            for (int j = 0; j < m + 1; j++) {
                D[0][j] = j;
            }
    
            // 计算所有 DP 值
            for (int i = 1; i < n + 1; i++) {
                for (int j = 1; j < m + 1; j++) {
                    int left = D[i - 1][j] + 1;
                    int down = D[i][j - 1] + 1;
                    int left_down = D[i - 1][j - 1];
                    if (word1.charAt(i - 1) != word2.charAt(j - 1)) {
                        left_down += 1;
                    }
                    D[i][j] = Math.min(left, Math.min(down, left_down));
                }
            }
            return D[n][m];
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月5日
  • 已采纳回答 6月5日
  • 赞助了问题酬金10元 6月5日
  • 创建了问题 6月5日

悬赏问题

  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面