题目:
我们从一块字母板上的位置 (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;
}