File tree 1 file changed +46
-0
lines changed
1 file changed +46
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {string } word
3
+ * @return {number }
4
+ */
5
+ var minimumDistance = function ( word ) {
6
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ;
7
+ const map = { } ;
8
+ for ( let i = 0 ; i < chars . length ; i ++ ) {
9
+ const v = chars . charCodeAt ( i ) - 65 ;
10
+ map [ v ] = [ Math . floor ( v / 6 ) , v % 6 ] ;
11
+ }
12
+
13
+ function getDis ( a , b ) {
14
+ const [ x1 , y1 ] = map [ a ] ;
15
+ const [ x2 , y2 ] = map [ b ] ;
16
+ return Math . abs ( x1 - x2 ) + Math . abs ( y1 - y2 ) ;
17
+ }
18
+
19
+ const dp = [ ] ;
20
+ let result = Number . MAX_SAFE_INTEGER ;
21
+ for ( let i = 0 ; i <= word . length ; i ++ ) {
22
+ dp [ i ] = new Array ( 26 ) ;
23
+ for ( let j = 0 ; j < 26 ; j ++ ) {
24
+ dp [ i ] [ j ] = new Array ( 26 ) . fill ( ( i === 0 ? 0 : Number . MAX_SAFE_INTEGER ) ) ;
25
+ }
26
+ if ( i === 0 ) {
27
+ continue ;
28
+ }
29
+
30
+ const v = word . charCodeAt ( i - 1 ) - 65 ;
31
+ for ( let l = 0 ; l < 26 ; l ++ ) {
32
+ for ( let r = 0 ; r < 26 ; r ++ ) {
33
+ if ( dp [ i - 1 ] [ l ] [ r ] !== Number . MAX_SAFE_INTEGER ) {
34
+ dp [ i ] [ v ] [ r ] = Math . min ( dp [ i ] [ v ] [ r ] , dp [ i - 1 ] [ l ] [ r ] + getDis ( l , v ) ) ;
35
+ dp [ i ] [ l ] [ v ] = Math . min ( dp [ i ] [ l ] [ v ] , dp [ i - 1 ] [ l ] [ r ] + getDis ( v , r ) ) ;
36
+ }
37
+
38
+ if ( i === word . length ) {
39
+ result = Math . min ( result , dp [ i ] [ l ] [ v ] , dp [ i ] [ v ] [ r ] ) ;
40
+ }
41
+ }
42
+ }
43
+ }
44
+
45
+ return result ;
46
+ } ;
You can’t perform that action at this time.
0 commit comments