哈希表题目:字母板上的路径
创始人
2025-05-31 06:15:44

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:字母板上的路径

出处:1138. 字母板上的路径

难度

4 级

题目描述

要求

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

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

字母板

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

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

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

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

示例

示例 1:

输入:target="leet"\texttt{target = "leet"}target = "leet"
输出:"DDR!UURRR!!DDD!"\texttt{"DDR!UURRR!!DDD!"}"DDR!UURRR!!DDD!"

示例 2:

输入:target="code"\texttt{target = "code"}target = "code"
输出:"RR!DDRR!UUL!R!"\texttt{"RR!DDRR!UUL!R!"}"RR!DDRR!UUL!R!"

数据范围

  • 1≤target.length≤100\texttt{1} \le \texttt{target.length} \le \texttt{100}1≤target.length≤100
  • target\texttt{target}target 仅含有小写英语字母

解法

思路和算法

字母 ‘a’\text{`a'}‘a’ 到 ‘z’\text{`z'}‘z’ 可以分别对应整数 000 到 252525,根据整数值即可得到每个字母对应字母板上的位置。

有两种做法可以得到每个字母对应字母板上的位置。第一种做法是使用哈希表记录每个字母对应字母板上的位置,第二种做法是不用哈希表,而是根据字母对应的整数计算字母对应字母板上的位置。两种做法得到每个字母对应字母板上的位置的时间复杂度相同,第二种做法可以省去哈希表的空间。此处的解法使用第二种做法。

用 index\textit{index}index 表示字母对应的整数,则有 0≤index≤250 \le \textit{index} \le 250≤index≤25。由于字母板有 555 列,因此 index\textit{index}index 所在行是 ⌊index5⌋\Big\lfloor\dfrac{\textit{index}}{5}\Big\rfloor⌊5index​⌋,index\textit{index}index 所在列是 indexmod5\textit{index} \bmod 5indexmod5。

为了得到最短的指令序列,对于目标 target\textit{target}target 中的每个字母,需要在字母板上按照最短路径移动到该字母所在位置,然后使用指令 ‘!’\text{`!'}‘!’ 将字母添加到答案中。按照最短路径移动时,首先根据原位置和新位置得到移动方向和移动次数,然后从原位置开始,在水平方向和竖直方向上分别向新位置移动。如果原位置和新位置相同则不需要移动。

初始位置是 (0,0)(0, 0)(0,0)。每次移动到新位置之后,需要将原位置的值更新为新位置的值,后续移动时根据更新后的原位置的值决定移动方向和移动次数。

由于字母 ‘z’\text{`z'}‘z’ 单独出现在最后一行,因此不能从字母 ‘z’\text{`z'}‘z’ 向右移动,也不可能通过向左移动到达字母 ‘z’\text{`z'}‘z’,否则将导致移动到不合法的位置(即没有字母的位置)。为了避免在包含字母 ‘z’\text{`z'}‘z’ 的情况下移动到不合法的位置,如果移动方向是左下或右上,则需要规定移动顺序:

  • 如果移动方向是左下,必须先向左移动,后向下移动;

  • 如果移动方向是右上,必须先向上移动,后向右移动。

对于其余的移动方向,包括上、下、左、右、左上和右下,则不需要规定移动顺序,先在水平方向移动或者先在竖直方向移动都是可以的。

代码

class Solution {public String alphabetBoardPath(String target) {StringBuffer sb = new StringBuffer();int row = 0, column = 0;int length = target.length();for (int i = 0; i < length; i++) {char c = target.charAt(i);int index = c - 'a';int newRow = index / 5, newColumn = index % 5;int rowDifference = newRow - row, columnDifference = newColumn - column;if (rowDifference > 0 && columnDifference < 0) {for (int j = 0; j > columnDifference; j--) {sb.append('L');}for (int j = 0; j < rowDifference; j++) {sb.append('D');}} else if (rowDifference < 0 && columnDifference > 0) {for (int j = 0; j > rowDifference; j--) {sb.append('U');}for (int j = 0; j < columnDifference; j++) {sb.append('R');}} else {if (rowDifference < 0) {for (int j = 0; j > rowDifference; j--) {sb.append('U');}} else if (rowDifference > 0) {for (int j = 0; j < rowDifference; j++) {sb.append('D');}}if (columnDifference < 0) {for (int j = 0; j > columnDifference; j--) {sb.append('L');}} else if (columnDifference > 0) {for (int j = 0; j < columnDifference; j++) {sb.append('R');}}}sb.append('!');row = newRow;column = newColumn;}return sb.toString();}
}

复杂度分析

  • 时间复杂度:O(n)O(n)O(n),其中 nnn 是字符串 target\textit{target}target 的长度。需要遍历字符串 target\textit{target}target 一次,对于每个字母生成指令序列,由于每个字母的指令最多为 101010 次,包括最多需要在字母板上移动 999 次和 111 次 ‘!’\text{`!'}‘!’,因此时间复杂度是 O(n)O(n)O(n)。

  • 空间复杂度:O(n)O(n)O(n),其中 nnn 是字符串 target\textit{target}target 的长度。空间复杂度主要取决于结果字符串的空间,由于每个字母的指令最多为 101010 次,包括最多需要在字母板上移动 999 次和 111 次 ‘!’\text{`!'}‘!’,因此空间复杂度是 O(n)O(n)O(n)。由于 Java 中的 String\texttt{String}String 类型的对象不可变,因此结果字符串的 O(n)O(n)O(n) 空间不可省略。

相关内容

热门资讯

回流和重绘 系列文章目录 前端系列文章——传送门 JavaScript系列文章——传送门 文章目录系列文章目录...
Linux-磁盘管理介绍 Linux-磁盘管理介绍 计算硬盘介绍 硬盘是计算机主要存储媒介之一,由一个或者多个铝...
物理里电荷量q等于多少,电荷量... 在物理学中,电荷量q是一个表示带电粒子所带电量的物理量。其单位是库仑(C)。电荷量可以是正数也可以是...
宜春是哪个省 极速百科网 极速... 宜春市,江西省辖地级市,位于江西省西北部,地处东经113°54′—116°27′,北纬27°33′—...
己所不欲勿施于人是什么意思,己... 所不欲,勿施于人尊重他人、不伤害他人的行为准则,也是建立和谐人际关系的重要原则。 这个准则强调...
什么是电压什么是电流,**电压... 电压,也称作电势差或电位差,是衡量单位电荷在静电场中由于电势不同所产生的能量差的物理量。电压的国际单...
lazada按关键字搜索商品 ... item_search-按关键字搜索商品  lazada.item_search 公共参数 请求地...
华为p10闪存怎么检测华为p ... 首先,非常感谢您对华为P10的关注。为了检测华为P10的闪存情况,您可以按照以下步骤进行操作: ...
广州哪里可以学做咖啡,广州学做... 1. 咖啡学院:专业的咖啡学院提供全面的咖啡课程,包括咖啡豆知识、咖啡制作技巧、咖啡品尝和评估等。在...
如何发现手机被监听,首先,我们... 1. 检查手机设置:确保你的手机设置中的隐私设置已经正确配置,并且只允许你信任的应用访问你的位置、通...
day13 模块和异常捕获总结 day13 模块和异常捕获 一、生成器 (一)、什么是生成器 1...
寒假文化课辅导招生宣传语有哪些... 1. 寒假来袭,文化课辅导助你一臂之力! 2. 告别寒假无聊,加入文化课辅导班,充实自己! ...
【新星计划2023】SQL S... 【新星计划2023】SQL SERVER -- 基础知识1. Introduction1.1 Off...
街边烤鸡20一只,揭秘背后的猫... 为什么农村土鸡一只卖上百块,而街上的烤鸡才20块? 难道还真是往船长的四...
微信小程序根据CODE获取用户... public function get_user_opendid() { $code = $...
漳州新车上牌流程(漳州汽车上牌... 今天给各位分享漳州新车上牌流程的知识,其中也会对漳州汽车上牌需要居住证吗进行解释,如果能碰巧解决你现...
载字的部首是哪一个 极速百科网... 载字的部首是“车”。收到你的喜欢啦收到你的喜欢啦载字的部首是哪一个汉字“载”是一个非常古老的文字,其...
常用的 IntelliJ ID... 以下是 30 个 IntelliJ IDEA 常用的快捷键: Ctrl + S...
喜可以组什么词成语,标题:喜从... 喜逐颜开、喜笑颜开、双喜临门、喜出望外、喜从天降、沾沾自满收到你的喜欢啦收到你的喜欢啦标题:喜从天降...
莫失莫忘仙寿恒昌是什么意思,标... “莫失莫忘,仙寿恒昌”是一句寓意深刻的话,可以理解为“不要忘记,就能够长久保持健康和长寿”。这句话表...
关于Docker逃逸 关于Docker逃逸 文章目录关于Docker逃逸前言一、判断是否为docker容器?...
在Centos上架设Zerot... Zerotier在国外,经常不好访问,Moon根服务也不是很好用。我们可...
超薄网络变压器(百兆千兆万兆)... Hqst华强盛:随着主板小型化,超薄型网络变压器越来越有集中的需求&#x...
思铂睿油耗有多少(思铂睿油耗多... 本篇文章极速百科给大家谈谈思铂睿油耗有多少,以及思铂睿油耗多少钱一公里对应的知识点,希望对各位有所帮...
描写冬天的好词好句 极速百科网... 好词: 银装素裹、白雪皑皑、玉树琼枝、寒风凛冽、冰天雪地、寒气逼人、雪中送炭、红炉暖阁、寒梅傲...
dnf怎么带人强开魔界深渊 极... 地下城与勇士(简称DNF)是由腾讯发行的手机游戏。该游戏是一款2D卷轴式横版格斗过关网络游戏,大量继...
高通670相当于骁龙多少 极速... 高通670相当于骁龙多少高通670处理器,这是一款颇受关注的产品,尤其在智能手机领域。作为美国高通公...
Qt实战技能 快捷键: 多行注释: 选中多行---ctrl+/ 打开文件或...
CentOS操作系统libc.... 使用xshell登陆Linux后查看jdk版本提示 /lib64/libc.so.6: versio...
@RequestMapping... 在享受了@RequestMapping方便的处理映射时,忍不住会开始好奇&#x...