🎉🎉🎉写在前面:
博主主页:🌹🌹🌹戳一戳,欢迎大佬指点!
目标梦想:进大厂,立志成为一个牛掰的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)。