【读书笔记:算法小抄】动态规划解决编辑距离问题——Java实现

简介

可以对一个字符串进行三种操作:插入一个字符,删除一个字符,替换一个字符,给你两个字符串s1和s2,请计算将s1转换成s2最少需要多少次操作。

代码

import static java.lang.System.out;

public class Helloworld {
    public static int minDistance(String s1, String s2){
        int m = s1.length(), n = s2.length();
        // 定义dp数组,其中dp[m][n]表示s1[0: m-1]和s2[0: n-1]的最小编辑距离
        int[][] dp = new int[m + 1][n + 1];

        // 初始化dp数组
        for (int i = 1; i <= m; i++) {
            // 下标0表示空串
            dp[i][0] = i;
        }

        for (int j = 1; j <= n; j++) {
            dp[0][j] = j;
        }

        // 填写dp表
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (s1.charAt(i - 1) == s2.charAt(j - 1))
                    dp[i][j] = dp[i - 1][j - 1];
                else
                    dp[i][j] = Math.min(dp[i - 1][j - 1] + 1, Math.min(dp[i][j - 1] + 1, dp[i - 1][j]) + 1);
            }
        }

        return dp[m][n];
    }


    public static void main(String[] args){
        String s1 = "intention";
        String s2 = "execution";
        int res = minDistance(s1, s2);
        out.println(res);
    }
}

可记录路径版

import java.util.Scanner;
import static java.lang.System.out;

public class Helloworld {
    static class Node{
        public int val;
        public int choice; // 0-skip,1-insert,2-delete,3-replace

        Node(int val, int choice){
            this.val = val;
            this.choice = choice;
        }
    }
    public static int minDistance(String s1, String s2){
        int m = s1.length(), n = s2.length();
        Node[][] dp = new Node[m + 1][n + 1];

        for (int i = 0; i <= m; i++) {
            dp[i][0] = new Node(i, 2);
        }

        for (int j = 1; j <= n; j++) {
            dp[0][j] = new Node(j, 1);
        }

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (s1.charAt(i - 1) == s2.charAt(j - 1))
                    dp[i][j] = new Node(dp[i - 1][j - 1].val, 0);
                else
                {
                    dp[i][j] = minNode(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]);
                    dp[i][j].val++;
                }
            }
        }

        return dp[m][n].val;
    }

    public static Node minNode(Node n_insert, Node n_delete, Node n_replace){
        Node res = new Node(n_insert.val, 1);

        if (res.val > n_delete.val){
            res.val = n_delete.val;
            res.choice = 2;
        }

        if (res.val > n_replace.val){
            res.val = n_replace.val;
            res.choice = 3;
        }

        return res;
    }


    public static void main(String[] args){
//        String s1 = "intention";
//        String s2 = "execution";
        Scanner sc = new Scanner(System.in);
        String s1 = sc.next();
        String s2 = sc.next();
        out.println(s1);
        out.println(s2);
        int res = minDistance(s1, s2);
        out.println(res);
    }
}

如果你认为对你有用,关注我的微信公众号支持我一下吧!~ 在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值