【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 两个字符串间的最短路径(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📎在线评测链接

🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系清隆解锁~

🍓OJ题目截图

在这里插入图片描述

文章目录

    • 📎在线评测链接
    • 🍓OJ题目截图
    • ✨ 两个字符串间的最短路径
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 样例解释
      • 数据范围
      • 题解
      • 参考代码

✨ 两个字符串间的最短路径

问题描述

给定两个字符串 A A A B B B。例如,字符串 A A A 为 “ABCABBA”,字符串 B B B 为 “CBABAC”。可以构建一个大小为 m × n m \times n m×n 的二维数组,其中 m m m 为字符串 A A A 的长度, n n n 为字符串 B B B 的长度。定义二维数组的原点为 ( 0 , 0 ) (0, 0) (0,0),终点为 ( m , n ) (m, n) (m,n)。在数组中,水平和垂直的每条边的距离为 1,如果字符串 A A A 和字符串 B B B 在相同位置的字符相同,则可以画一条斜边,斜边的距离同样为 1。

例如,从 ( 0 , 0 ) (0, 0) (0,0) ( 0 , A ) (0, A) (0,A) 是水平边,距离为 1;从 ( 0 , A ) (0, A) (0,A) ( A , C ) (A, C) (A,C) 是垂直边,距离为 1。如果两个字符串在相同位置的字符相同,例如 ( A , C ) (A, C) (A,C) ( B , B ) (B, B) (B,B),则可以画一条斜边,距离为 1。这样,原点 ( 0 , 0 ) (0, 0) (0,0) 到终点 ( m , n ) (m, n) (m,n) 的最短路径包括水平边、垂直边和斜边。

image.png

输入格式

第一行包含两个用空格分隔的字符串 A A A B B B,字符串不为空,字符格式满足正则规则:[A-Z],且字符串长度 ≤ 10000 \leq 10000 10000

输出格式

输出从原点 ( 0 , 0 ) (0, 0) (0,0) 到终点 ( m , n ) (m, n) (m,n) 的最短路径距离。

样例输入

输入1

ABC ABC

输入2

ABCABBA CBABAC

样例输出

输出1

3

输出2

9

样例解释

对于输入 “ABC” 和 “ABC”,可以画出以下路径:

(0,0) -> (A,0) -> (A,A) -> (B,B) -> (C,C)

对于输入 “ABCABBA” 和 “CBABAC”,最短路径如下图红线标记,最短距离为 9:

(0,0) -> (A,0) -> (A,C) -> (B,B) -> (C,B) -> (A,A) -> (B,B) -> (B,B) -> (A,A) -> (A,C)

数据范围

字符串长度 ≤ 10000 \leq 10000 10000

题解

我们可以使用动态规划来解决这个问题。定义一个二维数组 d p dp dp,其中 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示从原点 ( 0 , 0 ) (0,0) (0,0) ( i , j ) (i,j) (i,j) 的最短距离。初始化时, d p [ 0 ] [ 0 ] = 0 dp[0][0] = 0 dp[0][0]=0,然后根据以下规则进行状态转移:

  1. 如果 i > 0 i > 0 i>0,则 d p [ i ] [ j ] = min ⁡ ( d p [ i ] [ j ] , d p [ i − 1 ] [ j ] + 1 ) dp[i][j] = \min(dp[i][j], dp[i-1][j] + 1) dp[i][j]=min(dp[i][j],dp[i1][j]+1)
  2. 如果 j > 0 j > 0 j>0,则 d p [ i ] [ j ] = min ⁡ ( d p [ i ] [ j ] , d p [ i ] [ j − 1 ] + 1 ) dp[i][j] = \min(dp[i][j], dp[i][j-1] + 1) dp[i][j]=min(dp[i][j],dp[i][j1]+1)
  3. 如果 i > 0 i > 0 i>0 j > 0 j > 0 j>0 A [ i − 1 ] = = B [ j − 1 ] A[i-1] == B[j-1] A[i1]==B[j1],则 d p [ i ] [ j ] = min ⁡ ( d p [ i ] [ j ] , d p [ i − 1 ] [ j − 1 ] + 1 ) dp[i][j] = \min(dp[i][j], dp[i-1][j-1] + 1) dp[i][j]=min(dp[i][j],dp[i1][j1]+1)

最后, d p [ m ] [ n ] dp[m][n] dp[m][n] 即为所求的最短路径距离。

参考代码

  • Python
def min_distance(A, B):m, n = len(A), len(B)dp = [[float('inf')] * (n + 1) for _ in range(m + 1)]dp[0][0] = 0for i in range(m + 1):for j in range(n + 1):if i > 0:dp[i][j] = min(dp[i][j], dp[i - 1][j] + 1)if j > 0:dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1)if i > 0 and j > 0 and A[i - 1] == B[j - 1]:dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + 1)return dp[m][n]A, B = input().split()
print(min_distance(A, B))
  • Java
import java.util.Scanner;public class Main {public static int minDistance(String A, String B) {int m = A.length();int n = B.length();int[][] dp = new int[m + 1][n + 1];for (int i = 0; i <= m; i++) {for (int j = 0; j <= n; j++) {dp[i][j] = Integer.MAX_VALUE;}}dp[0][0] = 0;for (int i = 0; i <= m; i++) {for (int j = 0; j <= n; j++) {if (i > 0) dp[i][j] = Math.min(dp[i][j], dp[i - 1][j] + 1);if (j > 0) dp[i][j] = Math.min(dp[i][j], dp[i][j - 1] + 1);if (i > 0 && j > 0 && A.charAt(i - 1) == B.charAt(j - 1)) {dp[i][j] = Math.min(dp[i][j], dp[i - 1][j - 1] + 1);}}}return dp[m][n];}public static void main(String[] args) {Scanner sc = new Scanner(System.in);String A = sc.next();String B = sc.next();System.out.println(minDistance(A, B));}
}
  • Cpp
#include <bits/stdc++.h>
using namespace std;int main() {string A, B;cin >> A >> B;int m = A.size(), n = B.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));dp[0][0] = 0;for (int i = 0; i <= m; i++) {for (int j = 0; j <= n; j++) {if (i > 0) dp[i][j] = min(dp[i][j], dp[i - 1][j] + 1);if (j > 0) dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1);if (i > 0 && j > 0 && A[i - 1] == B[j - 1]) {dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + 1);}}}cout << dp[m][n] << endl;return 0;
}

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

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

相关文章

npm创建一个空的vue3项目的方法或者pnpm创建vue3项目

1、前提我们已经安装了npm&#xff0c;或者pnpm 2、我们用npm来创建vue3项目 快速上手 | Vue.js 官网地址 这里我安装是的 node v18.20.3 以下是安装过程 &#xff1a; npm create vuelatest 根据自己的需要进行创建即可。 3、我们用pnpm来创建vite vue3项目 pnpm create …

Android 界面库 (二) 之 Data binding 详细介绍

1. 简介 回顾我们在前面文章《Android 界面库 (一) 之 View binding 简单使用》中学习的 View Binding&#xff0c;它旨在简化 View 与代码之间的绑定过程。它会在编译时期为每个 XML 布局文件生成相应的绑定类(Binding class)&#xff0c;该类里包含了布局文件每个有 ID 的 Vi…

【深度学习】服务器炼丹代码配置、Python使用指定gpu显卡运行代码

【显卡】服务器炼丹代码配置 写在最前面一、查看哪几块显卡能用二、使用指定gpu运行代码1、指定使用GPU0运行脚本&#xff08;默认是第一张显卡, 0代表第一张显卡的id,其他的以此类推&#xff09;2、指定使用多张显卡运行脚本 三、如何使用1、单块显卡使用2、多GPU训练使用Data…

昇思25天学习打卡营第3天|数据集全攻略:加载、操作与自定义

导入数据集相关库和类 首先&#xff0c;导入了 NumPy 库&#xff0c;并将其简称为 np 。要知道&#xff0c;NumPy 乃是用于科学计算的关键库&#xff0c;作用非凡。接着&#xff0c;从 mindspore.dataset 当中导入了 vision 模块。此外&#xff0c;还从 mindspore.dataset 里引…

小阿轩yx-Nginx 网站服务

小阿轩yx-Nginx 网站服务 由俄罗斯的 lgor Sysoev 开发其稳定、高效的特性逐渐被越来越多的用户认可 Nginx 服务基础 Nginx (发音为[engine x])专为性能优化而开发 最知名的优点 稳定性低系统资源消耗以及对 HTTP 并发连接的高处理能力(单台物理服务器可支持 30000~50000个…

抗击.michevol勒索病毒:保障数据安全的新策略

导言&#xff1a; 在今天高度互联的数字化环境中&#xff0c;数据安全面临着越来越复杂和普遍的威胁&#xff0c;勒索病毒如.michevol已成为了用户和企业普遍面临的风险。本文91数据恢复将探讨.michevol勒索病毒的特点、感染方式以及创新的防御策略&#xff0c;旨在帮助读者更…

车载双向认证框架设计

最近工作需要&#xff0c;手写了一个双向认证库&#xff0c;可以用在Java、Android上&#xff0c;不限于PC/手机、车载平台。首先我们来看看双向认证的原理机框架设计思路&#xff0c;最后会给出下载链接大家可以体验或者源码参考。 因为可以和FlexNet网络库&#xff08;参考我…

mac安装navicate

1.下载好之后点击安装包安装 2.一般情况下会提示安全性什么的,点击允许即可,然后会出现如下界面,点击安装即可. 3.点击打开 4.然后出现如下界面,点击Enter 5.将安装包拖入即可. 6.等待安装即可 7.安装完成后会在启动台看到Navicat16 的图标 8.然后打开软件界面如下:

访问外网的安全保障——反向沙箱

反向沙箱作为一种网络安全技术&#xff0c;其核心理念在于通过构建一个隔离且受控的环境&#xff0c;来有效阻止潜在的网络威胁对真实系统的影响。在当今日益复杂的网络环境中&#xff0c;如何借助反向沙箱实现安全上网&#xff0c;已成为众多用户关注的焦点。 随着信息化的发…

树莓派Pico

树莓派Pico是树莓派基金会推出的一款基于RP2040微控制器的微型计算机板&#xff0c;它是专为需要高性能微控制器的应用场景设计的&#xff0c;特别适合于需要实时控制、低功耗和小型化解决方案的项目。以下是树莓派Pico的详细介绍&#xff1a; ### 核心特点&#xff1a; - **基…

统信系统实战(2):安装redis

在系统中未发现redis,需要安装。 网上资料上说需要去redis官网下载,但是发现不管是github账号还是自己注册的sso账号,都各种提示有问题。 继续找资料,发现可以直接通过下载链接下载,指令如下: wget http://download.redis.io/releases/redis-6.0.6.tar.gz 成功下载,…

仓颉开发入门初体验

作者&#xff1a;黄林晴 顺便吆喝一声&#xff0c;如果你计算机、软件工程、电子等相关专业本科及以上学历&#xff0c;欢迎来共事。前端/后端/测试均可投&#xff0c;技术大厂。 前言 在刚刚召开的华为开发者大会&#xff08;HDC 2024&#xff09;上&#xff0c;华为内部研…

如何在Java中使用Levenshtein距离实现字符串相似度匹配

在许多应用中&#xff0c;我们需要根据用户输入的问题找到最匹配的已知问题。Levenshtein距离&#xff08;编辑距离&#xff09;是一个强大的工具&#xff0c;可以帮助我们衡量两个字符串之间的差异&#xff0c;并进一步计算它们的相似度。本文将使用一个具体的例子来展示如何在…

从架构设计的角度分析ios自带网络库和AFNetworking

总结&#xff08;先说明文章分析出的一些‘认知’&#xff09; 从本文中&#xff0c;我们可以总结出一些框架设计上的“认知”&#xff1a; 对于通用的常规配置信息方面的设计&#xff0c;我们可以通过定义一个“类似于NSURLSessionConfiguration、NSURLRequest”的类来完成设…

【算法专题--栈】后缀表达式求值 -- 高频面试题(图文详解,小白一看就会!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐解题思路 ⭐案例图解 四、总结与提炼 五、共勉 一、前言 后缀表达式求值 这道题&#xff0c;可以说是--栈专题--&#xff0c;最经典的一道题&#xff0c;也是在面试中频率最高的一道题目&#xff0c;通常在面试中&…

什么是ArchiMate?有优缺点和运用场景?

一、什么是ArchiMate? ArchiMate是一种由The Open Group发布的企业级标准&#xff0c;它是一种整合多种架构的可视化业务分析模型语言&#xff0c;也属于架构描述语言&#xff08;ADL&#xff09;。ArchiMate主要从业务、应用和技术三个层次&#xff08;Layer&#xff09;&…

QT在visual studio环境打开控制台窗口

明确需求 在VS环境中开发QT应用&#xff0c;有时遇到BUG想看日志&#xff0c;但是默认VS环境没有显示控制台窗口可看日志。 解决方法 对工程名单击右键。 点击属性&#xff0c;在打开界面按照如下图操作。 设置完成后弹出的控制台窗口如下图。

[Cloud Networking] VLAN

1 为什么需要 VLAN(Virtual Local Area Network) VLAN是一个逻辑网络&#xff0c;VLAN将设备/用户进行逻辑分组&#xff0c;VLAN需要在Switch上创建。为什么需要这样呢&#xff1f;为何不能所有设备都在同一个网络&#xff1f; 如下网络&#xff0c;如果设备过多&#xff0c;…

【日记】怎么上了一天班饭都没得吃(659 字)

正文 今天算是混得最惨的一天了。 下午开始&#xff0c;柜面主管出差&#xff0c;她找了个代班&#xff0c;好家伙&#xff0c;代班直接不下来&#xff0c;于是整个营业室就只有我一个人了。所有客户逮着我一个人薅。我才下来一个月啊…… 明天她还不回来&#xff0c;要下周一&…

【UE5.3】笔记6-第一个简单小游戏

打砖块小游戏&#xff1a; 1、制造一面砖块组成的墙 在关卡中放置一个cube&#xff0c;放这地面上&#xff0c;将其转换成蓝图类,改名BP_Cube&#xff0c;更换砖块的贴图&#xff0c;按住alt键进行拷贝&#xff0c;堆出一面墙&#xff0c;复制出来的会很多&#xff0c;全选移动…