LeetCode 1138. 字母板上的路径

131 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

一、题目描述:

1138. 字母板上的路径 - 力扣(LeetCode)

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

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

image.png

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

  • 如果方格存在,'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

范文参考: