这道题关键:
1. 利用字母表的特点,字母是挨个排下来的,每行5个(除了最后一行),所以可以直接计算得出每个字母的位置,无需遍历寻找
2. 注意'z'字母的特殊情况,其他字母都是如果算出来两个方向,可以先走任意一个再走另一个,但'z'只有一个方向与其他字母连通,从'z'出来只能先上后右,走向'z'只能先左后下,为了不把'z'的情况单独处理,我们能向上就先向上、能向左就先向左走
/**
* Runtime: 0 ms, faster than 100.00%
* Memory Usage: 37 MB, less than 71.60%
*/
class Solution {
public String alphabetBoardPath(String target) {
StringBuffer res = new StringBuffer();
int x = 0, y = 0; // 出发的字母位置,每找到一个字母都要更新
for (char c : target.toCharArray()) {
int nx = (c - 'a') / 5, ny = (c - 'a') % 5; // 计算出要去到的字母位置
// 考虑到'z'位置的特殊性,能先往上走就先往上(如果从z出来只能先上再右),能先往左就先往左(如果往z走只能先左再下)
if (nx < x) { // 能往上
res.append("U".repeat(x - nx));
}
if (ny < y) { // 能往左
res.append("L".repeat(y - ny));
}
// 然后再往下or往右走
if (nx > x) { // 能往下
res.append("D".repeat(nx - x));
}
if (ny > y) { // 能往右
res.append("R".repeat(ny - y));
}
// 将找到的字母加入,并更新当前位置
res.append('!');
x = nx;
y = ny;
}
return res.toString();
}
}