关键:
1.使用DFS,记录一下聚聚的代码。感觉样例有些问题。可能是我没看懂题目。
class Solution {
public:
static constexpr int INF = 0x3f3f3f3f;
unordered_map<string, int> memo; // (board, hand)->minCount
// 求当board情况下, hand能得到的最优结果
int dfs(string board, string hand) {
// 记忆化
if (memo.count(board + "+" + hand)) {
return memo[board + "+" + hand];
}
string new_board = board;
// 首先尝试消去能够消去的部分
for (int i = 0; i < new_board.size(); i++) {
int j = i;
while (j < new_board.size() && new_board[j] == new_board[i]) {
++j;
}
if (j - i >= 3) { // [i, j)部分可消除
new_board.erase(i, j - i);
i = -1;
}
else {
i = j - 1;
}
}
if (new_board == "") {
memo[board + "+" + hand] = 0;
return 0;
}
// 尝试插入hand中的字符
int ans = INF;
for (int i = 0; i < new_board.size(); i++) {
for (int j = 0; j < hand.size(); j++) {
ans = min(ans, 1 + dfs(new_board.substr(0, i) + hand[j] + new_board.substr(i), hand.substr(0, j) + hand.substr(j + 1)));
}
}
memo[board + "+" + hand] = ans;
return ans;
}
int findMinStep(string board, string hand) {
int ans = dfs(board, hand);
return ans == INF ? -1 : ans;
}
};