本文主要是介绍OJ-0830**,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目
示例1
输入:
ABC ABC
输出:
3
示例2
输入:
ABCABBA CBABAC
输出:
9
解题思路
动态规划
首先,我们可以定义一个二维数组 dp,其中 dp[i][j] 表示从字符串A的前i个字符到字符串B的前j个字符的最短距离。然后,我们可以按照以下规则更新 dp 数组:
1.如果str1[i] == str2[j],则dp[i][j] = dp[i-1][j-1],表示可以形成一个斜边。
2.否则, dp[i][j]取dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]中的最小值,分别对应水平边、垂直边和斜边。
接下来,我们可以通过逐行逐列的方式填充 dp 数组,最终 dp[m][n]就是原点到终点的最短距离。
具体思路可以总结为:
1.初始化dp[0][j]和dp[i][0] ,分别表示空串到字符串B和字符串A到空串的距离。
2.从dp[1][1] 开始,逐行逐列填充 dp 数组。
3.根据上述规则更新 dp 数组。
4. 最终输出 dp[m][n],即原点到终点的最短距离。
题解
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String strA = in.next();String strB = in.next();char[] charA = ("0" + strA).toCharArray();char[] charB = ("0" + strB).toCharArray();int m = charA.length;int n = charB.length;int[][] dp = new int[n][m];for (int i = 0; i < m; i++) {dp[0][i] = i;}for (int i = 0; i < n; i++) {dp[i][0] = i;}for (int i = 1; i < n; i++) {for (int j = 1; j < m; j++) {if (charA[j] == charB[i]) {dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;} else {dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + 1;}}}System.out.println(dp[n - 1][m - 1]);}
}
https://blog.csdn.net/weixin_52908342/article/details/135737063
这篇关于OJ-0830**的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!