持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
一、题目描述:
我们从一块字母板上的位置 (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!"
提示:
- 1 <= target.length <= 100
- target 仅含有小写英文字母。
二、思路分析:
需要注意的点:
1、不能单存计算目标字符和前一个字符的字符步数:
如:e->f,只差一步右移,但是右边无方格,不能右移
2、计算目标字符和前一字符的行差列差:然后分行移动和列移动处理
注意点:z,由于z自己一行,左右均无方格,因此是边界情况
(1)、c->g: 行差为正数,不能直接下移目标步数,会超出方格
先列移再行移
(2)、g->c: g只能行移,不能列移,属于移动受限的情形
行差为负数,先行移再列移
三、AC 代码:
代码块
```import math
class Solution:
def alphabetBoardPath(self, target: str) -> str:
result=""
for i in range(len(target)):
if(i==0):
index=ord(target[i])-ord('a')
row=int(index/5)
col=index-5*row
else:
index1=ord(target[i])-ord('a')
index2=ord(target[i-1])-ord('a')
row1=int(index1/5)
col1=index1-5*row1
row2=int(index2/5)
col2=index2-5*row2
row=row1-row2
col=col1-col2
if(row>0):
if(col<0):
while(col<0):
result+='L'
col+=1
if(col>0):
while(col>0):
result+='R'
col-=1
while(row>0):
result+='D'
row-=1
else:
while(row<0):
result+='U'
row+=1
if(col<0):
while(col<0):
result+='L'
col+=1
if(col>0):
while(col>0):
result+='R'
col-=1
result+='!'
return result