两个字符串间的最短路径问题 - 华为OD统一考试

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

给定两个字符串,分别为字符串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。

image-20240129175030868

根据定义可知,原点到终点的最短距离路径如下图红线标记,最短距离为:9

image-20240129175120985

输入描述

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

输出描述

原点到终点的最短距离

示例1

输入:
ABC ABC输出:
3

示例2

输入:
ABCABBA CBABAC输出:
9

题解

这是一道典型的动态规划题目。题目要求计算两个字符串之间的最短距离,规定了三种操作:水平边移动、垂直边移动和斜边移动。每一种操作的距离为1。

解题思路

我们可以使用动态规划来解决这个问题。我们可以定义一个二维数组dp,其中dp[r][c]表示从原点到(r, c)点的最短距离。然后,我们可以根据题目规定的操作来更新dp数组。

具体步骤如下:

  1. 初始化dp数组,将所有元素初始化为一个较大的值(表示无穷大),除了dp[0][0]初始化为0。
  2. 初始化边界条件,即从原点到第一行和第一列的最短距离。
  3. 使用双层循环遍历字符串A和B的每个字符,根据题目规定的操作更新dp数组。操作包括水平边移动、垂直边移动和斜边移动。
  4. 最终,dp[m][n]即为从原点到终点的最短距离。

Java

import java.util.Arrays;
import java.util.Scanner;/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String A = scanner.next(), B = scanner.next();int m = A.length(), n = B.length();// dp[r][c] 为从原点到 (r,c)点的最短距离int[][] dp = new int[m + 1][n + 1];for (int r = 0; r <= n; r++) Arrays.fill(dp[r], Integer.MAX_VALUE);dp[0][0] = 0;for (int r = 0; r < m; r++) dp[r + 1][0] = dp[r][0] + 1;for (int c = 0; c < n; c++) dp[0][c + 1] = dp[0][c] + 1;for (int r = 0; r < m; r++) {for (int c = 0; c < n; c++) {// 来自从左侧 或 上侧dp[r + 1][c + 1] = Math.min(dp[r][c + 1], dp[r + 1][c]) + 1;if (A.charAt(r) == B.charAt(c)) {  // 来自从左上角dp[r + 1][c + 1] = Math.min(dp[r + 1][c + 1], dp[r][c] + 1);}}}System.out.println(dp[m][n]);}
}

Python

from math import inf
A, B = input().split()
cols, rows = len(A), len(B)# dp[r][c] 为从原点到 (r,c)点的最短距离
dp = [[inf] * (cols + 1) for _ in range(rows + 1)]# 初始化边界
dp[0][0] = 0for r in range(0, rows):dp[r+1][0] = dp[r][0] + 1
for c in range(0, cols):dp[0][c+1] = dp[0][c] + 1for r in range(rows):for c in range(cols):dp[r+1][c+1] = min(dp[r+1][c], dp[r][c+1]) + 1if A[c] == B[r]:dp[r+1][c+1] = min(dp[r+1][c+1], dp[r][c] + 1)print(dp[rows][cols])
# Python3 AC 96
# PyPy3 AC 100

C++

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {string A, B;cin >> A >> B;int m = A.length(), n = B.length();// dp[r][c] 为从原点到(r,c)点的最短距离vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));dp[0][0] = 0;for (int r = 0; r < m; r++)dp[r + 1][0] = dp[r][0] + 1;for (int c = 0; c < n; c++)dp[0][c + 1] = dp[0][c] + 1;for (int r = 0; r < m; r++) {for (int c = 0; c < n; c++) {// 来自从左侧或上侧dp[r + 1][c + 1] = min(dp[r][c + 1], dp[r + 1][c]) + 1;if (A[r] == B[c]) {  // 来自从左上角dp[r + 1][c + 1] = min(dp[r + 1][c + 1], dp[r][c] + 1);}}}cout << dp[m][n] << endl;return 0;
}

相关练习题

题号题目难易
LeetCode LCR 099LCR 099. 最小路径和中等
LeetCode 6164. 最小路径和中等

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/438217.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

地址簿功能代码

目录标题 1 需求分析和设计1.1 产品原型1.2 接口设计1.3 表设计 2 模板代码2.1 entity 实体对象2.2 Mapper层2.3 Service层2.4 Controller层 1 需求分析和设计 1.1 产品原型 地址簿&#xff0c;指的是消费者用户的地址信息&#xff0c;用户登录成功后可以维护自己的地址信息。…

上海共享办公室的现状与未来

共享办公室&#xff0c;又称联合办公、众创空间、孵化器等&#xff0c;是一种将空闲的办公空间出租给不同的企业或个人&#xff0c;提供灵活的租期、价格和服务的新型办公模式。共享办公室的出现&#xff0c;满足了新兴企业和自由职业者对于低成本、高效率、多元化的办公需求&a…

阿里十年 “帕鲁” 手把手带你学习 乐观锁和悲观锁

阿里十年 “帕鲁” 手把手带你学习 乐观锁和悲观锁 文章目录 阿里十年 “帕鲁” 手把手带你学习 乐观锁和悲观锁什么是悲观锁&#xff1f;什么是乐观锁&#xff1f;如何实现乐观锁&#xff1f;版本号机制CAS 算法 乐观锁存在哪些问题&#xff1f;ABA 问题循环时间长开销大只能保…

用C#实现最小二乘法(用OxyPlot绘图)

最小二乘法介绍✨ 最小二乘法&#xff08;Least Squares Method&#xff09;是一种常见的数学优化技术&#xff0c;广泛应用于数据拟合、回归分析和参数估计等领域。其目标是通过最小化残差平方和来找到一组参数&#xff0c;使得模型预测值与观测值之间的差异最小化。 最小二…

【node】Node.js的常用内置模块:

文章目录 一、os模块&#xff1a;【1】常用的OS模块方法包括&#xff1a;【2】案例&#xff1a; 二、path模块&#xff1a;【1】常用的path模块方法包括&#xff1a;【2】案例&#xff1a; 三、url模块&#xff1a;【1】常用的url模块方法包括&#xff1a;【2】案例&#xff1a…

Springboot+Netty搭建基于TCP协议的服务端

文章目录 概要pom依赖Netty的server服务端类Netty通道初始化I/O数据读写处理测试发送消息 并 接收服务端回复异步启动Netty运行截图 概要 Netty是业界最流行的nio框架之一&#xff0c;它具有功能强大、性能优异、可定制性和可扩展性的优点 Netty的优点&#xff1a; 1.API使用简…

超值福利,全是独家特制版软件,功能超凡且完全免费

闲话休提&#xff0c;直接为您呈现四款神仙级别的软件。 1、我的ABC软件工具箱 这款小巧而强大的批量处理办公助手——我的ABC软件工具箱&#xff0c;不仅界面清爽、无弹窗广告&#xff0c;更重要的是&#xff0c;它完全免费&#xff01;这款工具箱将成为您高效办公的得力助手…

【前端web入门第二天】02 表单-input标签-单选框-多选框

表单 文章目录: 1.input标签基本使用 1.1 input标签占位文本1.2 单选框 radio 1.3 多选框 checkbox 作用:收集用户信息。 使用场景: 登录页面注册页面搜索区域 1.input标签基本使用 input标签type属性值不同&#xff0c;则功能不同。 <input type"..."&g…

媒体邀约:怎么吸引总体目标受众?

新闻媒体影响力日益扩大。不论是公司、机构还是其他&#xff0c;都希望能够通过新闻媒体的曝光来吸引更多总体目标受众。要想真正吸引住总体目标受众并非易事&#xff0c;需要一定的方案和方法。下面我们就深入探究媒体邀约推广的真相&#xff0c;共享怎么吸引总体目标受众的方…

课时7:shell基础_shell简介

1.3.1 shell简介 学习目标 这一节&#xff0c;我们从 运维、shell语言、小结 三个方面来学习。 运维 简介 运维是什么&#xff1f;所谓的运维&#xff0c;其实就是公司的内部项目当中的一个技术岗位而已&#xff0c;它主要做的是项目的维护性工作。它所涉及的内容范围非常…

Python判断语句——if语句的基本格式

一、引言 在Python编程语言中&#xff0c;if语句是一种基本的控制流语句&#xff0c;用于根据特定条件执行不同的代码块。它的基本格式相对简单&#xff0c;使得Python代码清晰、易于阅读。下面&#xff0c;我们将深入探讨if语句的基本格式、用法和注意事项。 二、if语句的…

Apipost中API如何调用本地文件

近期版本更新中Apipost推出插件管理&#xff0c;可以直接在预、后执行脚本中调用本地的脚本文件 导入脚本 在「系统设置」—「插件管理」中打开目录将要执行的脚本文件拖入到文件夹下 执行脚本 需要获取请求参数&#xff1a; const requestData request.request_bodys; 在…