488. 祖玛游戏

文章目录

题意

题目链接

思路

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;
    }
};
相关推荐
灵感__idea1 小时前
Hello 算法:“走一步看一步”的智慧
前端·javascript·算法
lwf0061643 小时前
导数学习日记
学习·算法·机器学习
头发够用的程序员4 小时前
从滑动窗口到矩阵运算:img2col算法基本原理
人工智能·算法·yolo·性能优化·矩阵·边缘计算·jetson
武帝为此4 小时前
【数据清洗缺失值处理】
python·算法·数学建模
Halo_tjn5 小时前
Java 基于字符串相关知识点
java·开发语言·算法
念越5 小时前
算法每日一题 Day08|双指针法解决三数之和
算法·力扣
黎阳之光5 小时前
黎阳之光透明管理:视频孪生重构智慧仓储新范式
人工智能·算法·安全·重构·数字孪生
6Hzlia5 小时前
【Hot 100 刷题计划】 LeetCode 199. 二叉树的右视图 | C++ DFS 逆序遍历
c++·leetcode·深度优先
CappuccinoRose6 小时前
回溯法 - 软考备战(四十三)
算法·排列组合·路径·n皇后·子集·解数独·岛屿
AC赳赳老秦6 小时前
OpenClaw进阶技巧:批量修改文件内容、替换关键词,解放双手
java·linux·人工智能·python·算法·测试用例·openclaw