题目描述:

你正在参与祖玛游戏的一个变种。

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

你的目标是 清空 桌面上所有的球。每一回合:

从你手上的彩球中选出 任意一颗 ,然后将其插入桌面上那一排球中:两球之间或这一排球的任一端。
接着,如果有出现 三个或者三个以上 且 颜色相同 的球相连的话,就把它们移除掉。
如果这种移除操作同样导致出现三个或者三个以上且颜色相同的球相连,则可以继续移除这些球,直到不再满足移除条件。
如果桌面上所有球都被移除,则认为你赢得本场游戏。
重复这个过程,直到你赢了游戏或者手中没有更多的球。
给你一个字符串 board ,表示桌面上最开始的那排球。另给你一个字符串 hand ,表示手里的彩球。请你按上述操作步骤移除掉桌上所有球,计算并返回所需的 最少 球数。如果不能移除桌上所有的球,返回 -1 。(难度:困难)

原题链接:488. 祖玛游戏 - 力扣(LeetCode) (leetcode-cn.com)

C++代码:

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;}if (!st.empty() && st.top().first == board[pos]) {st.top().second++;} else {st.emplace(board[pos], 1);}if (st.top().second >= 3) {if (pos == board.size() || board[pos + 1] != board[pos]) {// 后面没有相同颜色的球,可以直接消去auto tmp = st.top();    st.pop();dfs(pos + 1, board);st.push(tmp);} else {// 后面有相同颜色的球,必须插入与当前位置不同色的小球进行分隔for (auto [ch, num] : rem) {if (ch == board[pos])continue;for (int j = 1; j <= min(3, num); ++j) {rem[ch] -= j;used += j;auto tmp = st.top();    st.pop();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();}st.push(tmp);used -= j;rem[ch] += j;}}}}// 插入与当前位置同色的小球if (rem[board[pos]] >= 1 && (pos == board.size() || board[pos + 1] != board[pos])) {int lim = rem[board[pos]];for (int i = 1; i <= min(2, lim); ++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;}}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;}
};

LeetCode 力扣每日一题 488.祖玛游戏相关推荐

  1. leetcode 力扣每日一题系列详解——总目录

    这是总目录,该系列持续更新中........ leetcode 力扣每日一题系列详解--总目录

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

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

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

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

  4. 【JAVA】交错字符串——力扣每日一题(六)(2020.07.18)

    目录 题目:97. 交错字符串 思路 如果你从本文中学习到丝毫知识,那么请您点点关注.点赞.评论和收藏 大家好,我是爱做梦的鱼,我是东北大学大数据实验班大三的小菜鸡,非常渴望优秀,羡慕优秀的人,个人博 ...

  5. 【爬虫】力扣每日一题每天自动邮件提醒!!!

    使用python实现了一个力扣每日一题每天自动邮件提醒的小爬虫,小但实用!!! 文章目录 A.需求来源与分析 B.技术角度分析 C.具体分析步骤 1.接口协议分析 2.发邮件 3.写crontab放服 ...

  6. 力扣每日一题每天自动邮件提醒

    A.需求来源与分析 需求来源于生活,对于只是偶尔有兴趣做做题的我,力扣的每日一题对我一直有以下的不便: 太简单不想做,需要花太多时间的不想做,每天打开力扣其实只是想看一下是什么题,有意思才做. 看题需 ...

  7. 力扣每日一题——两数相加II

    发现做的题难度始终不高,今天Leecode给了一个稍微难一点的题目.(前两天没更是因为去拔牙了~~>_<~~) 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每 ...

  8. 力扣每日一题:1720.解码异或后的数组 python异或操作

    1720.解码异或后的数组 https://leetcode-cn.com/problems/decode-xored-array/ 难度:简单 题目: 未知 整数数组 arr 由 n 个非负整数组成 ...

  9. 力扣每日一题——独一无二出现的次数

    难度:简单 题目: 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数. 如果每个数的出现次数都是独一无二的,就返回 true:否则返回 false. 示例 1: 输入:arr = [1,2 ...

最新文章

  1. HDU1040简单排序题
  2. pandas使用str函数和startswith函数,筛选dataframe中(start with)以特定前缀开头的数据列(selecting columns begin with certain
  3. UITesting Bundle使用
  4. markdown错误和问题
  5. Vue.js组件化开发实践
  6. 科大星云诗社动态20210907
  7. 【代码】使用reentrantlock必须要手动释放锁
  8. Java黑皮书课后题第4章:*4.9(给出字符的Unicode码)编写程序,得到一个字符的输入,然后显示其Unicode值
  9. 基于JAVA+Servlet+JSP+MYSQL的保险管理系统
  10. 删远端分支报错remote refs do not exist或git: refusing to delete the current branch解决方法
  11. pytorchgpu测试_pytorch学习(十)—训练并测试CNN网络
  12. rsync、scp “tab” 卡顿问题
  13. Matplotlib从入门到精通
  14. python标准库——datetime模块
  15. UBUNTU安装后的root/su密码问题
  16. struts2拦截器实现登录拦截
  17. vue中a的href写法
  18. 基于51控制的人体感应灯
  19. 欧拉路和欧拉回路知识
  20. 由左右眼图片合成红蓝/红青立体图

热门文章

  1. 【话费充值平台】话费充值平台接口设计
  2. 迷宫游戏(wap页游还原)-JavaScript实现
  3. 无人机这个创业方向靠谱吗?值得投资吗?
  4. 全景解密量子信息技术:高层集中学习,国家战略,三大领域一文看懂
  5. 利用Python预测股票价格
  6. 叉积 微分 恒等式_微分几何(一)
  7. 来自一位双非本科跌跌撞撞的秋招指南(秋招攻略/经验分享/干货)
  8. 战地五多计算机登录账户,玩战地5电脑配置要求
  9. 【京东电商网站主界面仿写——HTML第一部分】
  10. 3D数据---未来数字世界的物质基础