执行所有后缀指令
难度:
标签:
题目描述
现有一个 n x n
大小的网格,左上角单元格坐标 (0, 0)
,右下角单元格坐标 (n - 1, n - 1)
。给你整数 n
和一个整数数组 startPos
,其中 startPos = [startrow, startcol]
表示机器人最开始在坐标为 (startrow, startcol)
的单元格上。
另给你一个长度为 m
、下标从 0 开始的字符串 s
,其中 s[i]
是对机器人的第 i
条指令:'L'
(向左移动),'R'
(向右移动),'U'
(向上移动)和 'D'
(向下移动)。
机器人可以从 s
中的任一第 i
条指令开始执行。它将会逐条执行指令直到 s
的末尾,但在满足下述条件之一时,机器人将会停止:
- 下一条指令将会导致机器人移动到网格外。
- 没有指令可以执行。
返回一个长度为 m
的数组 answer
,其中 answer[i]
是机器人从第 i
条指令 开始 ,可以执行的 指令数目 。
示例 1:
输入:n = 3, startPos = [0,1], s = "RRDDLU" 输出:[1,5,4,3,1,0] 解释:机器人从 startPos 出发,并从第 i 条指令开始执行: - 0: "RRDDLU" 在移动到网格外之前,只能执行一条 "R" 指令。 - 1: "RDDLU" 可以执行全部五条指令,机器人仍在网格内,最终到达 (0, 0) 。 - 2: "DDLU" 可以执行全部四条指令,机器人仍在网格内,最终到达 (0, 0) 。 - 3: "DLU" 可以执行全部三条指令,机器人仍在网格内,最终到达 (0, 0) 。 - 4: "LU" 在移动到网格外之前,只能执行一条 "L" 指令。 - 5: "U" 如果向上移动,将会移动到网格外。
示例 2:
输入:n = 2, startPos = [1,1], s = "LURD" 输出:[4,1,0,0] 解释: - 0: "LURD" - 1: "URD" - 2: "RD" - 3: "D"
示例 3:
输入:n = 1, startPos = [0,0], s = "LRUD" 输出:[0,0,0,0] 解释:无论机器人从哪条指令开始执行,都会移动到网格外。
提示:
m == s.length
1 <= n, m <= 500
startPos.length == 2
0 <= startrow, startcol < n
s
由'L'
、'R'
、'U'
和'D'
组成
代码结果
运行时间: 64 ms, 内存: 16.1 MB
/*
* 思路:
* 使用Java Stream从每个起始指令开始进行迭代,计算每个起始点的最大可执行指令数。
* 使用流操作来简化代码,使用mapToInt将每个结果转化为int数组。
*/
import java.util.stream.IntStream;
public int[] executeInstructions(int n, int[] startPos, String s) {
return IntStream.range(0, s.length()).map(i -> {
int row = startPos[0], col = startPos[1];
int count = 0;
for (int j = i; j < s.length(); j++) {
switch (s.charAt(j)) {
case 'R': col++; break;
case 'L': col--; break;
case 'U': row--; break;
case 'D': row++; break;
}
if (row < 0 || row >= n || col < 0 || col >= n) {
break;
}
count++;
}
return count;
}).toArray();
}
解释
方法:
题解首先遍历一次指令字符串s,计算出机器人每执行一步后的坐标。然后再反向遍历字符串s,同时更新两个字典d_x和d_y,这两个字典用来记录机器人到达某个x或y坐标的最新指令计数。在反向遍历过程中,通过比较当前位置与边界的关系,使用这两个字典来确定从当前位置开始,机器人能够执行的最大指令数。对于每个起始指令位置,计算出从该位置开始直到结束或出界的可执行指令数,并存储在结果数组ans中。
时间复杂度:
O(m)
空间复杂度:
O(m)
代码细节讲解
🦆
在反向遍历字符串`S`的过程中,为什么需要使用两个字典`d_x`和`d_y`来分别记录机器人到达某个x或y坐标的最新指令计数?
▷🦆
如何确保字典`d_x`和`d_y`在记录过程中不会因为多个不同的坐标映射到相同的键而互相覆盖?
▷🦆
在算法中如何处理机器人移动到网格边界之外的情况,具体是怎样判断并计算机器人停止的位置?
▷🦆
题解中提到的`第二次反向遍历`是如何确保计算从每个位置开始能执行的最大指令数的准确性的?
▷