Minimum Distance to Type a Word Using Two Fingers LeetCode solution in Java

1
class Solution {
2
HashMap<Character, Integer[]> pos;
3
int[][][] memo;
4

5
int type(String word, int index, char finger1, char finger2) {
6
if (index == word.length()) return 0;
7
int ans = 9999999;
8
if (memo[index][finger1 - 'A'][finger2 - 'A'] != -1)
9
return memo[index][finger1 - 'A'][finger2 - 'A'];
10
if (finger1 == '[') {
11

12
ans = Math.min(ans, type(word, index + 1, word.charAt(index), finger2));
13
} else {
14

15
Integer[] prev = pos.get(finger1);
16
Integer[] curr = pos.get(word.charAt(index));
17
int dist = Math.abs(prev[0] - curr[0]) + Math.abs(prev[1] - curr[1]);
18
ans = Math.min(ans, type(word, index + 1, word.charAt(index), finger2) + dist);
19
}
20
if (finger2 == '[') {
21
ans = Math.min(ans, type(word, index + 1, finger1, word.charAt(index)));
22
} else {
23
Integer[] prev = pos.get(finger2);
24
Integer[] curr = pos.get(word.charAt(index));
25
int dist = Math.abs(prev[0] - curr[0]) + Math.abs(prev[1] - curr[1]);
26
ans = Math.min(ans, type(word, index + 1, finger1, word.charAt(index)) + dist);
27
}
28
memo[index][finger1 - 'A'][finger2 - 'A'] = ans;
29
return ans;
30
}
31

32
public int minimumDistance(String word) {
33
pos = new HashMap();
34
for (int i = 0; i < 26; i++) {
35
Integer[] coord = {i / 6, i % 6};
36
pos.put((char) ('A' + i), coord);
37
}
38
memo = new int[word.length()]['z' - 'a' + 3]['z' - 'a' + 3];
39
for (int[][] row : memo) {
40
for (int[] rowColumn : row) {
41
Arrays.fill(rowColumn, -1);
42
}
43
}
44
return type(word, 0, '[', '[');
45
}
46
}

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0