思路:暴力搜索
代码:
class Solution {
private static final int MAX = 0x3F3F3F3F;
public int findMinStep(String board, String hand) {
int ans = memoization(board, hand, new HashMap<>(), 1 << hand.length());
return ans == MAX ? -1 : ans;
}
private int memoization(String board, String hand, Map<String, Integer> cache, int cur) {
if (board.length() == 0) return 0;
if (cache.containsKey(board)) return cache.get(board);
int ans = MAX;
for (int i = 0; i < hand.length(); i++) {
if (((cur >> i) & 1) == 1) continue;
int next = (1 << i) | cur;
for (int j = 0; j <= board.length(); j++) {
boolean ok = false;
if (j > 0 && j < board.length() && board.charAt(j) == board.charAt(j - 1) && board.charAt(j - 1) != hand.charAt(i)) ok = true;
if (j < board.length() && board.charAt(j) == hand.charAt(i)) ok = true;
if (!ok) continue;
StringBuilder curBoard = new StringBuilder();
curBoard.append(board, 0, j).append(hand.charAt(i));
if (j != board.length()) curBoard.append(board.substring(j));
eliminateSameColor(curBoard, j);
ans = Math.min(ans, memoization(curBoard.toString(), hand, cache, next) + 1);
}
}
cache.put(board, ans);
return ans;
}
private void eliminateSameColor(StringBuilder curBoard, int i) {
while (i >= 0 && i < curBoard.length()) {
int left = i, right = i;
char c = curBoard.charAt(i);
while (left >= 0 && curBoard.charAt(left) == c) {
left--;
}
while (right < curBoard.length() && curBoard.charAt(right) == c) {
right++;
}
if (right - left > 3) {
curBoard.delete(left + 1, right);
i = left >= 0 ? left : right;
} else {
break;
}
}
}
}