欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 华为od-C卷200分题目3 - 两个字符串间的最短路径问题

华为od-C卷200分题目3 - 两个字符串间的最短路径问题

2024/10/24 4:37:30 来源:https://blog.csdn.net/Casual_Lei/article/details/139900625  浏览:    关键词:华为od-C卷200分题目3 - 两个字符串间的最短路径问题

华为od-C卷200分题目3 - 两个字符串间的最短路径问题

题目描述

给定两个字符串,分别为字符串A与字符串B。

例如A字符串为ABCABBA,B字符串为CBABAC可以得到下图m*n的二维数组,定义原点为(0, 0),终点为(m, n),水平与垂直的每一条边距离为1,映射成坐标系如下图。

从原点(0, 0)到(0, A)为水平边,距离为1,从(0, A)到(A, C)为垂直边,距离为1;

假设两个字符串同一位置的两个字符相同则可以作一个斜边,如(A, C)到(B, B)最短距离为斜边,距离同样为1。

作出所有的斜边如下图,(0, 0)到(B, B)的距离为 1个水平边 + 1个垂直边 + 1个斜边 = 3。
在这里插入图片描述

根据定义可知,原点到终点的最短距离路径如下图红线标记,最短距离为:9
在这里插入图片描述

输入描述

空格分割的两个字符串A与字符串B,字符串不为“空串”,字符格式满足正则规则:[A-Z],字符串长度<10000

输出描述

原点到终点的最短距离

示例1
输入:
ABC ABC

输出:
3
示例2
输入:
ABCABBA CBABAC

输出:
9

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String s = sc.nextLine();String[] str = s.split(" ");int n = str[0].length();int m = str[1].length();int[][] nums = new int[n + 1][m + 1];for (int i = 1; i <= n; i++) {nums[i][0] = i;}for (int i = 1; i <= m; i++) {nums[0][i] = i;}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {nums[i][j] = Math.min(nums[i][j - 1], nums[i - 1][j]) + 1;if (str[0].charAt(i - 1) == str[1].charAt(j - 1)) {nums[i][j] = Math.min(nums[i][j], nums[i - 1][j - 1] + 1);}}}System.out.println(nums[n][m]);}
}

思路:动态规划,当前位置的最小值取决于前一步,要么是上要么是左,如果当前字符相同则可以走斜线,左上角的位置

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com