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. java 绑定事件_Javascripts事件基础和事件绑定
  2. 【REST SOAP】REST和SOAP Web Service的区别比较
  3. leetcode 65. 有效数字(正则表达式)
  4. c++ 类和对象的内存管理
  5. [转] C++中 const, volatile, mutable用法
  6. 计算机网络体系结构及协议
  7. Message Code 【27796】 Failed to connect to server 'hostname';port_ld': 'reason'.
  8. unity三维地形制作
  9. 微软官方的SQLHelper类(含完整中文注释)
  10. Web前端笔试115道题(带答案及解析)
  11. 上市一再受阻,“微医”再融资4亿美元就能敲开“港股”大门?
  12. Java for Android 基础API整理
  13. 计算机特殊的标点符号教案,在电脑上怎么输入比较特殊的标点符号?
  14. 复现论文常用函数(一)tf.one_hot,tf.train.batch,tf.train.shuffle_batch,数据读取机制,获取文件路径,Bunch等
  15. Windows VScode SSH连接 Bad owner or permissions on C:\\Users\\admin/.ssh/config 错误解决方法
  16. Linux文件误删的恢复
  17. 【区块链 | Compound】4.剖析DeFi借贷产品之Compound:清算篇
  18. App开发难吗?主要的难点在哪?
  19. 激活信息管理slmgr.vbs命令详解
  20. Redis三种启动方式(Linux)

热门文章

  1. numba 报错 SystemError: initialization of _internal failed without raising an exception
  2. MIMO技术(二)衰落和干扰
  3. Linux SMP启动流程学习(三)
  4. Mysql 表分区创建方法
  5. 中文词频统计与词云生成
  6. 日语配合计算机应用技术,基于计算机协同工作技术的日语语料库构建及应用
  7. 百度贴吧日引流100+的实战方法!
  8. 【剧情游戏】 丧尸危机
  9. 2021西门子比赛东北赛区一等奖WINCC画面
  10. 高智商翻木块java_高智商游戏翻木块