字符串 
      
    
      
      
      
        模拟 
      
    
   
  
    
      
       
     
  
  
    
      
    
    
      
       
     
  
    
题目描述 
现有一个 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 ; 
}