字符串最短编辑距离

在这里插入图片描述

🎉🎉🎉写在前面:
博主主页:🌹🌹🌹戳一戳,欢迎大佬指点!
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个小菜鸟嘿嘿
-----------------------------谢谢你这么帅气美丽还给我点赞!比个心-----------------------------

在这里插入图片描述


字符串的编辑距离

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        //动态规划问题
        //三种操作中选一个操作步骤数最小的
        Scanner scan = new Scanner(System.in);
        String s1 = scan.next();
        String s2 = scan.next();
        int len1 = s1.length();
        int len2 = s2.length();
        int[][] dp = new int[len1 + 1][len2 + 1];//多出一行一列做辅助
        //多出的一行一列是为了辅助计算dp[1][1]之类的值
        for(int i = 0;i <= len1;i++){
            //将字符串A的前i个字符转换成字符串B的前0个字符 也就是空字符串所需要的操作数
            dp[i][0] = i;
        }
        for(int j = 0;j <= len2;j++){
            //将字符串A的前0个字符转换层字符串B的前j个字符所需要的操作数
            dp[0][j] = j;
        }
        //此处的i j都是表示的字符位置 不是下标 第几第几个字符
        for(int i = 1;i <= len1;i++){
            for(int j = 1;j <= len2;j++){
                //先求以下 增加 删除操作的较小值
                dp[i][j] = Math.min(dp[i][j-1] + 1,dp[i-1][j] + 1);
                //在考虑替换
                if(s1.charAt(i-1) == s2.charAt(j-1)){
                    //不需要进行替换
                    dp[i][j] = Math.min(dp[i][j],dp[i-1][j-1]);
                }else{
                    //需要做出替换
                    dp[i][j] = Math.min(dp[i][j],dp[i-1][j-1] + 1);
                }
            }
        }
        System.out.println(dp[len1][len2]);//输出最终结果值
    }
}

面对动态规划的问题,首先需要进行状态的定义,也就是将一个一个大问题抽象出一个局部的问题出来,然后可以递推的整个问题的解。这里的题目是让我们求解出如何将字符串A经历最少的操作步骤然后转换成字符串B,我们抽离出局部就是将字符串A的前i个字符转换成字符串B的前j个字符的三种操作下的最小操作步骤数,这里用状态函数F(i,j)表示。

解决了状态的定义,知道了从哪里入手之后,就需要进行状态的计算,也就是状态转义方程的定义,如何计算出每种每个状态下的最小操作步骤数。

题目说的一共会有三种操作,那么我们先每种操作推出其状态函数的值,最终三者中选取一个最小的值。
在这里插入图片描述


所以总结出来,总的状态转义方程就是F(i,j) = Math.min( F(i,j-1) + 1 , F(i-1,j) + 1 , A[i] == B[i] ? F(i-1 , j-1) : F(i-1,j-1) + 1)。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力学习.java

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

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

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

打赏作者

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

抵扣说明:

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

余额充值