【1138. 字母板上的路径】

news2024/9/25 13:17:13

来源:力扣(LeetCode)

描述:

我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]

在本题里,字母板为 board = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"],如下所示。

1

我们可以按下面的指令规则行动:

  • 如果方格存在,'U' 意味着将我们的位置上移一行;
  • 如果方格存在,'D' 意味着将我们的位置下移一行;
  • 如果方格存在,'L' 意味着将我们的位置左移一列;
  • 如果方格存在,'R' 意味着将我们的位置右移一列;
  • '!' 会把在我们当前位置 (r, c) 的字符 board[r][c] 添加到答案中。

(注意,字母板上只存在有字母的位置。)

返回指令序列,用最小的行动次数让答案和目标 target 相同。你可以返回任何达成目标的路径。

示例 1:

输入:target = "leet"
输出:"DDR!UURRR!!DDD!"

示例 2:

输入:target = "code"
输出:"RR!DDRR!UUL!R!"

提示:

  • 1 <= target.length <= 100
  • target 仅含有小写英文字母。

方法:直接模拟

思路与算法

  由于所有的字符在字母板上的位置是固定的,因此从任意字符 a 到字符 b 的路径也是固定的,我们从中选出一条最短路径即可。两个字符之间的最短距离即等于二者在画板中坐标的曼哈顿距离,可以直接按照“折线”的方式走即可。假设两个字符 a, b 在画板中的位置分别为 (xa, ya), (xb, yb),其中 xa, xb 表示字符 a, b 的行坐标,ya, yb 表示字符 a, b 的列坐标。假设当前处在字符 a 处,需要移动到字符 b,此时只需先上下移动 ∣xa − xb∣ 个位置,再左右移动 ∣ya − yb∣ 个位置,再执行一次添加操作即可完成字符 b 的添加。

当前字母板中的字符分布如下:
1

需要注意的是字符 ‘z’ 所在的行只有一列,此时有以下两种特殊情况需要考虑:

  • 从字符 ‘z’ 开始移动到其他字符时,第一步只能上移到字符 ‘u’。因此‘z’ 移动到其他字符时,需要先往上移动到目标字符所在的行,再向右移动到目标字符所在的列;

  • 由于字符 ‘z’ 所在的行只有一列,从其他字符移动到字符 ‘z’ 时,必须先移动到字符 ‘u’,再向下移动到 ‘z’,最后一步操作一定是下移。因此从其他字符移动到字符 ‘z’ 时,需要先往左移动到第 0 列,再向下移动到字符 ‘z’ 即可;

  • 对于其他字符的移动指令,可以先上下移动再左右移动或者先左右移动再上下移动均可。

综上所述,为了保证含有字符 ‘z’ 时能够正常移动,每次移动时优先保证选择上移和左移即可。

代码:

class Solution {
public:
    string alphabetBoardPath(string target) {
        int cx = 0, cy = 0;
        string res;
        for (char c : target) {
            int nx = (c - 'a') / 5;
            int ny = (c - 'a') % 5;
            if (nx < cx) {
                res.append(cx - nx, 'U');
            }
            if (ny < cy) {
                res.append(cy - ny, 'L');
            } 
            if (nx > cx) {
                res.append(nx - cx, 'D');
            }
            if (ny > cy) {
                res.append(ny - cy, 'R');
            }  
            res.push_back('!');
            cx = nx;
            cy = ny;
        }
        return res;
    }
};

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.9 MB, 在所有 C++ 提交中击败了69.70%的用户
复杂度分析
时间复杂度: O(n×(r+c)),其中 n 表示给定字符串的长度,r 表示字母板的行数, c 表示字母板的列数。每次移动到新的字符生成移动指令时,需要的时间复杂度为 r+c,一共需要生成指令 n 次,因此时间复杂度为 O(n×(r+c))。
空间复杂度:O(1)。除返回值以外不需要额外的申请空间。
author:LeetCode-Solution

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

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

相关文章

文本比对工具【UltraCompare附安装包】Mac和Windows下载使用

UltraCompare 强大的文件&#xff0c;文件夹&#xff0c;PDF, Word和Excel比较。文件夹同步&#xff0c;二进制/十六进制比较。下载一个免费的全功能试用版&#xff0c;看看为什么。适用于Windows、Mac和Linux。 文章目录软件功能1、文本比较2、快速二进制比较3、智慧二进制比较…

Python快速上手系列--类--详解篇

本章是自动化测试的真正开始&#xff0c;因为在后续的过程中&#xff0c;你会接触到unittest框架&#xff0c;pytest框架&#xff0c;而不仅仅只是写一个函数selenium脚本这么简单了。1、创建类1.1、了解类我们首先了解一下&#xff0c;为什么要使用类&#xff0c;类可以拿来干…

2023同等学力申请硕士计算机综合国考

同等学力国考报名要开始了 2023年2月15日&#xff0c;中国教育考试网和“全国同等学力人员申请硕士学位管理工作信息平台”&#xff08;https://tdxl.chsi.com.cn&#xff0c;联系服务电话&#xff1a;010-67410388&#xff09;公布报名工作通知。考生须按照通知要求进行注册或…

Win11下Linux子系统迁移方法及报错解决

Win11 将Linux子系统从C盘迁移到其他盘Win11下Linux子系统迁移方法及报错解决1、下载LxRunOffline2、ERROR&#xff1a;directory is not empty 报错解决参考链接Win11下Linux子系统迁移方法及报错解决 C盘满了&#xff0c;Ubuntu子系统占了100多G怎么办&#xff1f;直接将子系…

相机出图画面一半清晰,一半模糊的原因是什么?

1、问题背景&#xff1a;在做项目的过程中&#xff0c;有遇到过几次&#xff0c;出图后画面是一半清晰&#xff0c;一半模糊的现象&#xff0c;再重新对焦也是一样。但换了个镜头后就好了&#xff0c;这应该是镜头的质量问题&#xff0c;但导致镜头出现这种问题的具体原因是什么…

【2023unity游戏制作-mango的冒险】-3.基础动作和动画API实现

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity游戏制作 ⭐mango的基础动作动画的添加⭐ 文章目录⭐mango的基础动作动画的添加⭐&#x1f…

本周大新闻|传微软解散工业元宇宙团队,MIT研发垂直堆叠全彩Micro LED

本周大新闻&#xff0c;AR方面&#xff0c;消息称微软解散工业元宇宙团队&#xff1b;德国AR公司Gixel GmbH亮相&#xff1b;Brilliant推出单片式附加形态AR眼镜&#xff1b;MIT研发垂直堆叠全彩Micro LED&#xff1b;谷歌XR串流正式上线。VR方面&#xff0c;索尼发布了PS VR2的…

【手写 Vuex 源码】第八篇 - Vuex 的 State 状态安装

一&#xff0c;前言 上一篇&#xff0c;主要介绍了 Vuex 模块安装的实现&#xff0c;针对 action、mutation、getter 的收集与处理&#xff0c;主要涉及以下几个点&#xff1a; Vuex 模块安装的逻辑&#xff1b;Vuex 代码优化&#xff1b;Vuex 模块安装的实现&#xff1b;Vue…

leetcode-每日一题-2335(简单,贪心)

自己打表看一下过程就可以发现&#xff0c;其实就是每次选两个大的进行--之后秒数加1即可现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。给你一个下标从 0 开始、长度为 3 的整数数组 amount &am…

元学习(Meta Learning)最全论文、视频、书籍资源整理

Meta Learning&#xff0c;叫做元学习或者 Learning to Learn 学会学习&#xff0c;包括Zero-Shot/One-Shot/Few-Shot 学习&#xff0c;模型无关元学习(Model Agnostic Meta Learning)和元强化学习&#xff08;Meta Reinforcement Learning&#xff09;。元学习是人工智能领域&…

Redis基础篇

Redis基础篇 来自黑马的redis课程的笔记 【黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】 目录Redis基础篇一、初识Redis1.安装2. 数据结构二、Redis常见命令1. Redis通用命令2. string类型2.1 key的层级格式…

【成为架构师课程系列】预备架构 Pre-Architecture 的故事

目录 前言 Pre-architecture的故事 Pre-architecture 核心“四步法” 需求结构化 架构约束

1行Python代码去除图片水印,网友:一干二净

大家好&#xff0c;这里是程序员晚枫。 最近小明在开淘宝店&#xff08;店名&#xff1a;爱吃火锅的少女&#xff09;&#xff0c;需要给自己的原创图片加水印&#xff0c;于是我上次给她开发了增加水印的功能&#xff1a;图片加水印&#xff0c;保护原创图片&#xff0c;一行…

伏并网低电压穿越技术

国内光伏并网低电压穿越要求 略&#xff1a; 低电压穿越方法 当前&#xff0c;光伏电站实现低电压穿越可通过两种方式&#xff0c;即增加硬件设备或者改变控制策略。本节对基于储能设备、基于无功补偿设备、基于无功电流电压支撑控制策略三种实现LVRT的典型方法进行介绍。 …

【MT7628】开发环境搭建-Fedora12一步一步设置共享文件夹

1.按照下图操作,打开设置界面 2.点击设置,弹出如下对话框

【博客620】prometheus如何优化远程读写的性能

prometheus如何优化远程读写的性能 场景 为了解决prometheus本地存储带来的单点问题&#xff0c;我们一般在高可用监控架构中会使用远程存储&#xff0c;并通过配置prometheus的remote_write和remote_read来对接 远程写优化&#xff1a;remote_write 远程写的原理&#xff1a…

Springboot扩展点之@PostConstruct

前言postContruct全限定类名是javax.annotation.PostConstruct&#xff0c;可以看出来其本身不是Spring定义的注解&#xff0c;但是Spring提供了具体的实现&#xff0c;所以这篇文章主要分析的是PostConstruct在Spring项目开发中的功能特性、实现方式和基本工作原理。功能特性从…

Linux c编程之Wireshark

Wireshark是一个网络报文分析软件,是网络应用问题分析必不可少的工具软件。网络管理员可以使用wireshark排查网络问题。程序开发人员可以用来分析应用协议、定位分析应用问题。无论是网络应用程序开发人员、测试人员、部署人员、技术支持人员,掌握wireshark的使用对于分析网络…

【LeetCode】每日一题(2)

目录 题目&#xff1a;1138. 字母板上的路径 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;1138. 字母板上的路径 - 力扣&am…

Python-项目实战--贪吃蛇小游戏-游戏框架搭建(2)

1.游戏框架搭建介绍pygame开发图像界面游戏的几个要素&#xff0c;并且把贪吃蛇游戏的整体框架搭建完成本节知识点包括&#xff1a;pygame的初始化和退出游戏主窗口游戏循环和游戏时钟主窗口背景颜色绘制文本pygame的坐标系游戏事件监听绘制图形定时器事件1.1pygame的初始化和退…