文章目录
题意
思路
dfs
代码
C++
class Solution {
public:
string exchange(string tmp) {
bool next = false;
do{
next = false;
for (int l = 0, r = 0; l < tmp.size() && r < tmp.size(); l++) {
r = l + 1;
while (r < tmp.size() && tmp[l] == tmp[r] )
r++;
if (r - l >= 3) {
tmp.erase(l, r - l);
next = true;
break;
}
}
} while (next);
return tmp;
}
int findMinStep(string board, string hand) {
queue<pair<string, string>> Q;
sort(hand.begin(), hand.end());
Q.push(make_pair(board, hand));
unordered_set<string> s;
s.insert(board + "|" + hand);
int step = 1;
while (!Q.empty()) {
int n = Q.size();
for (int i = 0; i < n; i++) {
const auto &index = Q.front();
const string b = index.first;
const string h = index.second;
Q.pop();
for (int j = 0; j < h.size(); j++) {
if (j > 0 && h[j] == h[j - 1])
continue;
for (int k = 0; k <= b.size(); k++) {
if (k > 0 && h[j] == b[k] && b[k] == b[k - 1])
continue;
if (!(k < b.size() && h[j] == b[k] || (k >= 1 && b[k - 1] == b[k])))
continue;
string c(1, h[j]);
string b_tmp = b.substr(0, k) + c + b.substr(k);
string b_next = exchange(b_tmp);
if (b_next == "")
return step;
string h_next = h.substr(0, j) + h.substr(j + 1);
string key = b_next + "|" + h_next;
if (s.find(key) == s.end()) {
Q.push(make_pair(b_next, h_next));
s.insert(key);
}
}
}
}
step++;
}
return - 1;
}
};