class Solution {int ans, used;unordered_map<char, int> rem;stack<pair<char, int>> st;void dfs(int pos, string &board) {if (used >= ans)return;if (pos == board.size()) {if (st.empty())ans = used;return;}// 将pos位置的小球加入if (!st.empty() && st.top().first == board[pos]) {st.top().second++;} else {st.emplace(board[pos], 1);}if (st.top().second >= 3) {if (pos + 1 == board.size() || board[pos + 1] != board[pos]) {// 后面没有相同颜色的球,可以直接消去auto tmp = st.top();    st.pop();dfs(pos + 1, board);st.push(tmp);} else {// 后面有相同颜色的球,必须插入与当前位置不同色的小球进行分隔后,才能将当前积累的小球消去;否则必须和后面的同色球一起消去。auto tmp = st.top(); // 维护现场st.pop(); // 消去当前积累的同色小球for (auto [ch, num] : rem) {if (ch == board[pos])continue;for (int j = 1; j <= min(3, num); ++j) {rem[ch] -= j;used += j;// 加入j个小球if (!st.empty() && st.top().first == ch) {st.top().second += j;} else {st.emplace(ch, j);}if (st.top().second >= 3) { // 插入的异色球和之前的球累加达到了三个auto tmp2 = st.top(); // 维护现场st.pop(); // 消去同色球dfs(pos + 1, board);st.push(tmp2); // 还原现场} else {dfs(pos + 1, board);}// 还原现场if (st.top().second > j) {st.top().second -= j;} else {st.pop();}used -= j;rem[ch] += j;}}st.push(tmp); // 还原现场}}// 插入与当前位置同色的小球if (rem[board[pos]] >= 1 && (pos + 1 == board.size() || board[pos + 1] != board[pos])) {int lim = rem[board[pos]];for (int i = 1; i <= min(2, lim); ++i) {// 加入i个同色小球rem[board[pos]] -= i;used += i;st.top().second += i;if (st.top().second >= 3) { // 累积同色球达到三个auto tmp = st.top(); // 维护现场st.pop(); // 消去同色球dfs(pos + 1, board);st.push(tmp); // 还原现场} else {dfs(pos + 1, board);}// 还原现场st.top().second -= i;used -= i;rem[board[pos]] += i;}}// 不额外插入小球的情形// 1. 当前颜色小球不满三个// 2. 当前颜色小球满三个,但当前小球和下一小球同色,这说明初始情形为XX...XX,之后中间的小球被消去,从而形成了XXXX,这种情况是允许的。if (st.top().second < 3 || (st.top().second == 3 && pos + 1 < board.size() && board[pos] == board[pos + 1]))dfs(pos + 1, board);// 还原现场if (st.top().second == 1) {st.pop();} else {st.top().second--;}}
public:int findMinStep(string board, string hand) {for (char ch : hand)rem[ch]++;ans = 1e9;used = 0;dfs(0, board);return ans == 1e9 ? -1 : ans;}
};

※※※※※ 488. 祖玛游戏相关推荐

  1. Java实现 LeetCode 488 祖玛游戏

    488. 祖玛游戏 回忆一下祖玛游戏.现在桌上有一串球,颜色有红色®,黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球. 每一次,你可以从手里的球选一个,然后把这个球插入到一 ...

  2. LeetCode每日一题488. 祖玛游戏

    488. 祖玛游戏 你正在参与祖玛游戏的一个变种. 在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 'R'.黄色 'Y'.蓝色 'B'.绿色 'G' 或白色 'W' .你的手中也 ...

  3. 力扣解题思路:488. 祖玛游戏

    488. 祖玛游戏 思路: 实际上就是简单的消消乐,如果时间允许,最简单的暴力递归法也是可以的,就是把所有字母插入所有的位置,取最短且可以消去的插入球数即可.但是这样无脑插入是很浪费时间的,所以我们在 ...

  4. LeetCode 力扣每日一题 488.祖玛游戏

    题目描述: 你正在参与祖玛游戏的一个变种. 在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 'R'.黄色 'Y'.蓝色 'B'.绿色 'G' 或白色 'W' .你的手中也有一些彩 ...

  5. Leetcode 488.祖玛游戏

    祖玛游戏 回忆一下祖玛游戏.现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球. 每一次,你可以从手里的球选一个,然后把这个球插入到一串球中 ...

  6. LeetCode 488. 祖玛游戏

    题目描述 回忆一下祖玛游戏.现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球. 每一次,你可以从手里的球选一个,然后把这个球插入到一串球中 ...

  7. ​LeetCode-每日一题 488. 祖玛游戏 [Java实现]

    你正在参与祖玛游戏的一个变种. 在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 'R'.黄色 'Y'.蓝色 'B'.绿色 'G' 或白色 'W' .你的手中也有一些彩球. 你的目 ...

  8. 488 祖玛游戏 python

    没有找到这个题比较好的Java题解 class Solution:def findMinStep(self, board: str, hand: str) -> int:def remove(b ...

  9. 2021-11-09祖玛游戏

    488. 祖玛游戏 难度困难208 你正在参与祖玛游戏的一个变种. 在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 'R'.黄色 'Y'.蓝色 'B'.绿色 'G' 或白色 'W ...

最新文章

  1. MyBatis4:动态SQL
  2. 小端字节序与大端字节序
  3. 终于理解了函数式技术
  4. mysql更新字符串中某个字符串_mysql更新某个字符串字段的部分内容
  5. text/html与text/plain的区别
  6. as3.0 mysql_RedhatAS3.0上安装Apache2+PHP5+MySQL+Resin+SSL+GD+weba_PHP教程
  7. kvm虚拟化学习笔记(十)之kvm虚拟机快照备份
  8. 将Java项目从maven迁移到gradle
  9. java jxl上传excel_JAVA实现上传,下载,jxl操作Excel和邮件发送
  10. 渗透测试专业术语——攻击篇
  11. openpose环境搭建(详细教程CPU/GPU)windows 10+python 3.7+CUDA 11.6+VS2022
  12. T32 load elf
  13. 第22期《杂聊1:易破解密码列表》
  14. 一个数据分析的真实失败案例,让我突然有点恍惚了
  15. 动态规划之背包问题 01背包
  16. 互联网日报 | 蚂蚁集团确定IPO发行价;小米双11将拿出10亿补贴;特斯拉上海超级工厂启动整车出口...
  17. 高性能超融合服务器,深信服高性能单路服务器aServer-R-1600超融合一体机
  18. 03-Spring Boot 2.0 新特性详解
  19. 工薪阶层如何用5年理出100W?绝对实用方法
  20. Linux系统根目录下文件是啥

热门文章

  1. 计算机2 游戏攻略,史上最坑爹的游戏2全关卡游戏攻略大全
  2. Linux获得webinf路径,Linux系统快速定位web路径方法
  3. windows系统“IE浏览器将此网站添加兼容性视图”详细图文教程
  4. vue 自定义指令 directive 全局 directives 局部 inserted update
  5. 电商行业安全解决方案
  6. C# 窗体制作Aero效果
  7. python安装pymongo_PyMongo安装使用笔记
  8. Vue知识点整理(三)- Vue脚手架(1)- 初始化Vue脚手架、简单分析Vue脚手架结构
  9. 什么是疲劳试验基础之材料力学
  10. win10添加美式键盘_Win10自带的这6款软件,90%的人都不知道,但个个都好用到爆!...