2
HashMap<Character, Integer[]> pos;5
int type(String word, int index, char finger1, char finger2) {6
if (index == word.length()) return 0;8
if (memo[index][finger1 - 'A'][finger2 - 'A'] != -1)9
return memo[index][finger1 - 'A'][finger2 - 'A'];12
ans = Math.min(ans, type(word, index + 1, word.charAt(index), finger2));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);21
ans = Math.min(ans, type(word, index + 1, finger1, word.charAt(index)));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);28
memo[index][finger1 - 'A'][finger2 - 'A'] = ans;32
public int minimumDistance(String word) {34
for (int i = 0; i < 26; i++) {35
Integer[] coord = {i / 6, i % 6};36
pos.put((char) ('A' + i), coord);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);44
return type(word, 0, '[', '[');