1. 问题描述:
我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。在本题里,字母板为board = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"],如下所示:
我们可以按下面的指令规则行动:
如果方格存在,'U' 意味着将我们的位置上移一行;
如果方格存在,'D' 意味着将我们的位置下移一行;
如果方格存在,'L' 意味着将我们的位置左移一列;
如果方格存在,'R' 意味着将我们的位置右移一列;
'!' 会把在我们当前位置 (r, c) 的字符 board[r][c] 添加到答案中。(注意,字母板上只存在有字母的位置。)
返回指令序列,用最小的行动次数让答案和目标 target 相同。你可以返回任何达成目标的路径。
示例 1:
输入:target = "leet"
输出:"DDR!UURRR!!DDD!"
示例 2:
输入:target = "code"
输出:"RR!DDRR!UUL!R!"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/alphabet-board-path
2. 思路分析:
① 一开始感觉是应该是搜索的题目,但是仔细一看发现不是这个因为每一个相邻的字母都是有它的相对位置的,我们只需要计算出前后两个相邻字母的相对位置即可知道最短的路径的走法,这里可以借助于字母对应的ascii码进行计算,得出当前的字母在字母板中的位置,比如字母"l"的位置是11计算出在第二行第一列(索引从0)开始,然后我们使用两个变量来保存上一个字母的位置,这样在计算得到当前字母位置的时候就可以得到两个字母当前行与列的差值,根据差值就可以确定具体的字母走法了,这里需要注意的是行与列的差值与对应的字母走法需要一一的对应
② 上面a-y相邻两个字母的走法,对于上一个字母是z的情况也就是z到其他字母的走法我们可以调整代码的顺序使z字母先往上走,然后再往右走,这样可以避免z先往右走没有路径的问题,但是对于其他字母到z的情况我们可以使用一个方法对其进行特殊处理即可,先往下走,然后往左走,最后往下一格即可,主要是模拟整个的过程即可解决
③ 看了一下领扣的题解之后发现可以使用字典进行映射的方法来计算出每一个字母的位置,映射的时候可以根据字母的ascii值使用chr函数将其转为对应的字母,然然后将对应字母的位置以元祖的形式存储到字典中,最后使用四个if判断就可以避免其他字母到z的走法
3. 代码如下:
class Solution:
def alphabetBoardPath(self, target: str) -> str:
# 特别处理其他字母到字母z的路径
def solve(cux: int, cury: int, prex: int, prey: int):
res = ""
if curx - prex > 0:
res += "D" * (curx - prex - 1)
if prey - cury > 0:
res += "L" * (prey - cury)
res += "D!"
return res
prex, prey, res = 0, 0, ""
ascii_a = ord("a")
for i in range(len(target)):
ascii_curchar = ord(target[i])
curx = (ascii_curchar - ascii_a) // 5
cury = (ascii_curchar - ascii_a) - curx * 5
# 与上一次一样的字母
if curx - prex == 0 and cury - prey == 0:
res += "!"
continue
# 处理其他字母到z字母
if i > 0 and curx == 5:
res += solve(curx, cury, prex, prey)
# 更新上一个字母的位置
prex, prey = curx, cury
continue
if curx - prex > 0:
res += "D" * (curx - prex)
else:
res += "U" * (prex - curx)
if cury - prey > 0:
res += "R" * (cury - prey) + "!"
else:
res += "L" * (prey - cury) + "!"
prex, prey = curx, cury
return res
class Solution:
def alphabetBoardPath(self, target: str) -> str:
x, y, d = 0, 0, dict()
for i in range(26):
# chr函数可以
d[chr(i + 97)] = (i // 5, i % 5)
pre, res = (0, 0), ""
for c in target:
cur = d[c]
dx, dy = cur[0] - pre[0], cur[1] - pre[1]
if dx < 0: res += "U" * (-dx)
if dy < 0: res += "L" * (-dy)
if dx > 0: res += "D" * dx
if dy > 0: res += "R" * dy
res += "!"
pre = cur
return res