算法刷题打卡第88天:字母板上的路径
字母板上的路径
难度:中等
我们从一块字母板上的位置 (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!"
哈希表
思路:
- 根据字符输入,可以计算出对应的位置
- 根据位置左右和上下移动即可
- 需注意,移动到z只能先左右再上下,从z移动出去只能先上下再左右
复杂度分析:
- 时间复杂度: O(n)O(n)O(n),nnn 为 targettargettarget 长度
- 空间复杂度: O(c)O(c)O(c),ccc 为 262626。
class Solution:def alphabetBoardPath(self, target: str) -> str:word_dicts = dict()board = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"]for x, i in enumerate(board):for y, j in enumerate(i):word_dicts[j] = [x, y]now_position = [0, 0]res = ""def lr_move(target_position, now_position, res):if target_position[1] - now_position[1] >= 0:res += 'R' * abs(target_position[1] - now_position[1])else:res += 'L' * abs(target_position[1] - now_position[1])return resdef ud_move(target_position, now_position, res):if target_position[0] - now_position[0] >= 0:res += 'D' * abs(target_position[0] - now_position[0])else:res += 'U' * abs(target_position[0] - now_position[0])return resfor i in target:target_position = word_dicts[i]if i != 'z':res = ud_move(target_position, now_position, res)res = lr_move(target_position, now_position, res)else: res = lr_move(target_position, now_position, res)res = ud_move(target_position, now_position, res)res += "!"now_position = target_positionreturn res
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/alphabet-board-path