我们从一块字母板上的位置 (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
仅含有小写英文字母。
分析:
将字母看作一个坐标表格,计算对应的曼哈顿距离就可以了,需要注意的是,答案给的走法必须先上下后左右,并且对于特殊情况"zdz"和"zz"需要特殊处理.
class Solution {
public:
string alphabetBoardPath(string target) {
// 将字符转化为数字,根据每个数字的坐标来确定执行位置
// 保存结果
string result = "";
// 保存前一个字母的横纵坐标,初始化为0
int pre_x, pre_y;
pre_x = pre_y = 0;
for(int i=0; i<target.length(); ++i){
int index = target[i]-'a';
int curr_x = index%5;
int curr_y = index/5;
// 判断行走的位置
result += path_to_next(pre_x,pre_y,curr_x,curr_y);
result += "!";
pre_x = curr_x;
pre_y = curr_y;
}
return result;
}
// 得到走到下一个字母的路径
string path_to_next(int startx,int starty,int endx,int endy){
/*
01234
abcde
fghij
klmno
pqrst
uvwxy
z
*/
string result = "";
// 先从上到下,后从左到右,
int dy = starty - endy;
int dx = startx - endx;
// 特殊处理
if(endy == 5 && endy != starty)
dy ++;
while(dy > 0){
result += 'U';
dy --;
}
while(dy < 0){
result += 'D';
dy ++;
}
while(dx > 0){
result += 'L';
dx --;
}
while(dx < 0){
result += 'R';
dx ++;
}
// 特殊处理
if(endy == 5 && endy != starty)
result += "D";
return result;
}
};