字符串
模拟
题目描述
现有一个 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: "R RDDLU" 在移动到网格外之前,只能执行一条 "R" 指令。
- 1: "RDDLU " 可以执行全部五条指令,机器人仍在网格内,最终到达 (0, 0) 。
- 2: "DDLU " 可以执行全部四条指令,机器人仍在网格内,最终到达 (0, 0) 。
- 3: "DLU " 可以执行全部三条指令,机器人仍在网格内,最终到达 (0, 0) 。
- 4: "L U" 在移动到网格外之前,只能执行一条 "L" 指令。
- 5: "U" 如果向上移动,将会移动到网格外。
示例 2:
输入: n = 2, startPos = [1,1], s = "LURD"
输出: [4,1,0,0]
解释:
- 0: "LURD "
- 1: "U RD"
- 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'
组成
解法
方法一
Python3 Java C++ Go TypeScript Rust C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 class Solution :
def executeInstructions ( self , n : int , startPos : List [ int ], s : str ) -> List [ int ]:
ans = []
m = len ( s )
mp = { "L" : [ 0 , - 1 ], "R" : [ 0 , 1 ], "U" : [ - 1 , 0 ], "D" : [ 1 , 0 ]}
for i in range ( m ):
x , y = startPos
t = 0
for j in range ( i , m ):
a , b = mp [ s [ j ]]
if 0 <= x + a < n and 0 <= y + b < n :
x , y , t = x + a , y + b , t + 1
else :
break
ans . append ( t )
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 class Solution {
public int [] executeInstructions ( int n , int [] startPos , String s ) {
int m = s . length ();
int [] ans = new int [ m ] ;
Map < Character , int []> mp = new HashMap <> ( 4 );
mp . put ( 'L' , new int [] { 0 , - 1 });
mp . put ( 'R' , new int [] { 0 , 1 });
mp . put ( 'U' , new int [] { - 1 , 0 });
mp . put ( 'D' , new int [] { 1 , 0 });
for ( int i = 0 ; i < m ; ++ i ) {
int x = startPos [ 0 ] , y = startPos [ 1 ] ;
int t = 0 ;
for ( int j = i ; j < m ; ++ j ) {
char c = s . charAt ( j );
int a = mp . get ( c ) [ 0 ] , b = mp . get ( c ) [ 1 ] ;
if ( 0 <= x + a && x + a < n && 0 <= y + b && y + b < n ) {
x += a ;
y += b ;
++ t ;
} else {
break ;
}
}
ans [ i ] = t ;
}
return ans ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 class Solution {
public :
vector < int > executeInstructions ( int n , vector < int >& startPos , string s ) {
int m = s . size ();
vector < int > ans ( m );
unordered_map < char , vector < int >> mp ;
mp [ 'L' ] = { 0 , -1 };
mp [ 'R' ] = { 0 , 1 };
mp [ 'U' ] = { -1 , 0 };
mp [ 'D' ] = { 1 , 0 };
for ( int i = 0 ; i < m ; ++ i ) {
int x = startPos [ 0 ], y = startPos [ 1 ];
int t = 0 ;
for ( int j = i ; j < m ; ++ j ) {
int a = mp [ s [ j ]][ 0 ], b = mp [ s [ j ]][ 1 ];
if ( 0 <= x + a && x + a < n && 0 <= y + b && y + b < n ) {
x += a ;
y += b ;
++ t ;
} else
break ;
}
ans [ i ] = t ;
}
return ans ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 func executeInstructions ( n int , startPos [] int , s string ) [] int {
m := len ( s )
mp := make ( map [ byte ][] int )
mp [ 'L' ] = [] int { 0 , - 1 }
mp [ 'R' ] = [] int { 0 , 1 }
mp [ 'U' ] = [] int { - 1 , 0 }
mp [ 'D' ] = [] int { 1 , 0 }
ans := make ([] int , m )
for i := 0 ; i < m ; i ++ {
x , y := startPos [ 0 ], startPos [ 1 ]
t := 0
for j := i ; j < m ; j ++ {
a , b := mp [ s [ j ]][ 0 ], mp [ s [ j ]][ 1 ]
if 0 <= x + a && x + a < n && 0 <= y + b && y + b < n {
x += a
y += b
t ++
} else {
break
}
}
ans [ i ] = t
}
return ans
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 function executeInstructions ( n : number , startPos : number [], s : string ) : number [] {
const m = s . length ;
const ans = new Array ( m );
for ( let i = 0 ; i < m ; i ++ ) {
let [ y , x ] = startPos ;
let j : number ;
for ( j = i ; j < m ; j ++ ) {
const c = s [ j ];
if ( c === 'U' ) {
y -- ;
} else if ( c === 'D' ) {
y ++ ;
} else if ( c === 'L' ) {
x -- ;
} else {
x ++ ;
}
if ( y === - 1 || y === n || x === - 1 || x === n ) {
break ;
}
}
ans [ i ] = j - i ;
}
return ans ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 impl Solution {
pub fn execute_instructions ( n : i32 , start_pos : Vec < i32 > , s : String ) -> Vec < i32 > {
let s = s . as_bytes ();
let m = s . len ();
let mut ans = vec! [ 0 ; m ];
for i in 0 .. m {
let mut y = start_pos [ 0 ];
let mut x = start_pos [ 1 ];
let mut j = i ;
while j < m {
match s [ j ] {
b'U' => {
y -= 1 ;
}
b'D' => {
y += 1 ;
}
b'L' => {
x -= 1 ;
}
_ => {
x += 1 ;
}
}
if y == - 1 || y == n || x == - 1 || x == n {
break ;
}
j += 1 ;
}
ans [ i ] = ( j - i ) as i32 ;
}
ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 /**
* Note: The returned array must be malloced, assume caller calls free().
*/
int * executeInstructions ( int n , int * startPos , int startPosSize , char * s , int * returnSize ) {
int m = strlen ( s );
int * ans = malloc ( sizeof ( int ) * m );
for ( int i = 0 ; i < m ; i ++ ) {
int y = startPos [ 0 ];
int x = startPos [ 1 ];
int j = i ;
for ( j = i ; j < m ; j ++ ) {
if ( s [ j ] == 'U' ) {
y -- ;
} else if ( s [ j ] == 'D' ) {
y ++ ;
} else if ( s [ j ] == 'L' ) {
x -- ;
} else {
x ++ ;
}
if ( y == -1 || y == n || x == -1 || x == n ) {
break ;
}
}
ans [ i ] = j - i ;
}
* returnSize = m ;
return ans ;
}