当前位置: 首页 > news >正文

【华为OD题库-068】找出经过特定点的路径长度-java

题目

输入一个字符串,都是以大写字母组成,每个相邻的距离是1,第二行输入一个字符串,表示必过的点。
说明
每个点可过多次。求解经过这些必过点的最小距离是多少?
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
ANTSEDXQOKPUVGIFWHJLYMCRZB
ABC
输出
28

思路

本题不好理解,以示例数据为例,要经过ABC,必须走的路径是A->B->C,其中A->B的距离为25,b->c的距离为3,所以最后结果为28
题目描述太过简略,本文按照以下细节实现:

  1. 第一行和第二行均有可能含重复字符串
  2. 出发点并非起点
  3. 运动方向可随意变更,不能重复走原点。比如第二行输入ABBG,已经在第一个B了,需要找下一个B,而非自己

穷举所有可能性的组合,然后计算最短距离即可

题解

package hwod;import java.util.*;public class CrossSpecDotPath {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str1 = sc.nextLine();String targetStr = sc.nextLine();System.out.println(crossSpecDotPath(str1, targetStr));}private static Map<Character, List<Integer>> map = new HashMap<>(); //存放每个字符所有的索引位置private static int res = Integer.MAX_VALUE;private static int crossSpecDotPath(String originStr, String targetStr) {for (int i = 0; i < originStr.length(); i++) {List<Integer> oldList = map.getOrDefault(originStr.charAt(i), new ArrayList<>());oldList.add(i);map.put(originStr.charAt(i), oldList);}LinkedList<Integer> path = new LinkedList<>();//存放选择的路径dfs(path, targetStr, 0);return res;}private static void dfs(LinkedList<Integer> path, String targetStr, int distance) {if (targetStr.length() < 1) {//路径走完了if (distance < res) {res = distance;}return;}List<Integer> list = map.get(targetStr.charAt(0));//本次寻找的目标字符,可能出现在哪些位置for (int item : list) {if (!path.isEmpty() && path.peekLast() == item) continue;//不允许走原点if (!path.isEmpty()) distance += Math.abs(item - path.peekLast());//累加距离path.addLast(item);dfs(path, targetStr.substring(1), distance);//找下一个目标int lst = path.peekLast();path.removeLast();if (!path.isEmpty()) distance -= Math.abs(lst - path.peekLast());}}}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

相关文章:

  • html5各行各业官网模板源码下载(1)
  • 如何将 MySQL 数据库转换为 SQL Server
  • 分布式搜索引擎elasticsearch(二)
  • NGINX安装升级
  • 数据库基础语法
  • CSS 垂直水平居中总结(全)
  • 香港商标注册申请所需资料及办理流程
  • netty使用
  • 【Flink on k8s】- 4 - 在 Kubernetes 上运行容器
  • C#winform上下班打卡系统Demo
  • 鸿蒙系统开发手册 - HarmonyOS内核驱动层源码分析
  • 实现跨VLAN通信、以及RIP路由协议的配置
  • JAVA实现敏感词高亮或打码过滤:sensitive-word
  • TCP通讯
  • Linux UUCP命令教程:如何在Linux系统中进行文件复制(附实例详解和注意事项)
  • express + mock 让前后台并行开发
  • Java比较器对数组,集合排序
  • Java知识点总结(JavaIO-打印流)
  • Joomla 2.x, 3.x useful code cheatsheet
  • React-Native - 收藏集 - 掘金
  • 对超线程几个不同角度的解释
  • 解析 Webpack中import、require、按需加载的执行过程
  • 力扣(LeetCode)21
  • 聊聊sentinel的DegradeSlot
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 日剧·日综资源集合(建议收藏)
  • 收藏好这篇,别再只说“数据劫持”了
  • 一个JAVA程序员成长之路分享
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 积累各种好的链接
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • # C++之functional库用法整理
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #pragma data_seg 共享数据区(转)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (二)Linux——Linux常用指令
  • (二)windows配置JDK环境
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET基础篇——反射的奥妙
  • .net专家(张羿专栏)
  • @Pointcut 使用
  • [ 第一章] JavaScript 简史
  • [2]十道算法题【Java实现】
  • [4.9福建四校联考]
  • [Android]使用Retrofit进行网络请求
  • [BZOJ1053][HAOI2007]反素数ant
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [C#C++]类CLASS