LeetCode 1138.字母板上的路径

该文描述了一个编程挑战,要求找到从字母板的特定位置出发,通过最少的移动步数到达目标字符串的路径。题目提供了字母板的布局和一系列可执行的移动指令(上、下、左、右和添加字符)。解题策略包括遍历目标字符串,计算字符间的相对位置并构建相应的移动指令序列。
摘要由CSDN通过智能技术生成

题目
我们从一块字母板上的位置 (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 仅含有小写英文字母。

解题思路

  • 首先先定义字母板,在这里我使用map来保存每个字母的坐标位置
  • 遍历目标字符串
    • 先保存前一个字母的位置,初始化为 字母 “a” 的坐标[0, 0]
    • 遍历目标字符串,获得当前字符的坐标
  • 判断当前字符处于前一个字符的位置(是左下、左下还是右上右下),得到需要的是哪个方向的字符
  • 先上 -> 再左 -> 再右 -> 再下,按照这个来往结果字符串中添加方向字符
  • 到cur字符后需要往结果字符串中添加 “!”,然后更新前一个字符坐标为当前字符坐标
/**
 * @param {string} target
 * @return {string}
 */
var alphabetBoardPath = function (target) {
  const table = {
    "a": [0, 0], "b": [0, 1], "c": [0, 2], "d": [0, 3], "e": [0, 4],
    "f": [1, 0], "g": [1, 1], "h": [1, 2], "i": [1, 3], "j": [1, 4],
    "k": [2, 0], "l": [2, 1], "m": [2, 2], "n": [2, 3], "o": [2, 4],
    "p": [3, 0], "q": [3, 1], "r": [3, 2], "s": [3, 3], "t": [3, 4],
    "u": [4, 0], "v": [4, 1], "w": [4, 2], "x": [4, 3], "y": [4, 4],
    "z": [5, 0]
  };
  let res = "";
  let pre = [0, 0];
  for (let i = 0; i < target.length; i++) {
    cur = table[target[i]];
    let y = cur[0] - pre[0];
    let x = cur[1] - pre[1];
    if(y<0) {
      res += str('U',y);
    }
    if (x < 0) {
      res += str('L',x);
    } else {
      res += str('R',x);
    }
    if (y > 0) {
      res += str('D',y);
    }

    res+="!"
    pre = cur;
  }
  return res;
};

function str(ch, num) {
  num = Math.abs(num);
  let res = "";
  for (let i = 0; i < num; i++) {
    res += ch;
  }
  return res;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值