题目描述
题目链接:[LeetCode 1138]字母板上的路径
我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。
在本题里,字母板为board = [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”],如下所示。
示例1
输入:target = “leet”
输出:“DDR!UURRR!!DDD!”
示例2
输入:target = “code”
输出:“RR!DDRR!UUL!R!”
提示:
1 <= target.length <= 100
target 仅含有小写英文字母。
思路分析
很简单的题目,主要是z的判别比较恶心,第一想法是判断当前点是否在z这个地方,如果在z的话,需要先移动到u的位置,再移动到所要去的位置(因为z的右边是不能走的)
后面稍微细想了一下,发现只要调整变换顺序就可以解决了,如果我们把向上判断放在向右之前,那么路径肯定是先向上走再向右,这样可以避免在z点先右后上的错误路径
同理,向左判断必须放在向下之前,例如从v到z,必须先向左走再向下,如果先向下在向左,就会到达不可达的区域
代码
class Solution {
public:
string solve(int a, int b, int c, int d) {
string res;
//向左在向下之前,向上在向右之前
while(b > d) res += 'L', b--;
while(a < c) res += 'D', a++;
while(a > c) res += 'U', a--;
while(b < d) res += 'R', b++;
res += '!';
return res;
}
string alphabetBoardPath(string target) {
string res;
int x = 0, y = 0;
for (int i = 0; i < target.size(); i++) {
int t = target[i] - 'a', p = t / 5, q = t % 5;
res += solve(x, y, p, q);
x = p, y = q;
}
return res;
}
};