1
var findMinStep = function (board, hand) {3
var recursion = function (board, hand) {4
if (board.length === 0) return 0;6
var key = board + "-" + hand;7
if (map[key]) return map[key];9
var res = hand.length + 1;11
for (var i = 0; i < hand.length; i++) {12
if (set.has(hand[i])) continue;13
for (var j = 0; j < board.length; j++) {14
// Board: ..WW.., Hand: ..(W).. => W(W)W === WW(W)16
j < board.length - 1 &&17
board[j] === board[j + 1] &&21
var newBoard = board.slice(0, j + 1) + hand[i] + board.slice(j + 1);22
var newHand = hand.slice(0, i) + hand.slice(i + 1);23
res = Math.min(res, recursion(reduceBoard(newBoard), newHand) + 1);32
var result = recursion(board, hand);33
return result > hand.length ? -1 : result;36
var reduceBoard = function (board) {38
for (var i = 0; i < board.length; i++) {39
// Check group of 3 or more balls in the same color touching41
i < board.length - 2 &&42
board[i] === board[i + 1] &&43
board[i + 1] === board[i + 2]47
while (board[i] === board[i + 1]) i++;49
return reduceBoard(board.slice(0, start) + board.slice(i + 1));