LeetCode 力扣每日一题 488.祖玛游戏
题目描述:
你正在参与祖玛游戏的一个变种。
在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 '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.祖玛游戏相关推荐
- leetcode 力扣每日一题系列详解——总目录
这是总目录,该系列持续更新中........ leetcode 力扣每日一题系列详解--总目录
- LeetCode每日一题488. 祖玛游戏
488. 祖玛游戏 你正在参与祖玛游戏的一个变种. 在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 'R'.黄色 'Y'.蓝色 'B'.绿色 'G' 或白色 'W' .你的手中也 ...
- 力扣解题思路:488. 祖玛游戏
488. 祖玛游戏 思路: 实际上就是简单的消消乐,如果时间允许,最简单的暴力递归法也是可以的,就是把所有字母插入所有的位置,取最短且可以消去的插入球数即可.但是这样无脑插入是很浪费时间的,所以我们在 ...
- 【JAVA】交错字符串——力扣每日一题(六)(2020.07.18)
目录 题目:97. 交错字符串 思路 如果你从本文中学习到丝毫知识,那么请您点点关注.点赞.评论和收藏 大家好,我是爱做梦的鱼,我是东北大学大数据实验班大三的小菜鸡,非常渴望优秀,羡慕优秀的人,个人博 ...
- 【爬虫】力扣每日一题每天自动邮件提醒!!!
使用python实现了一个力扣每日一题每天自动邮件提醒的小爬虫,小但实用!!! 文章目录 A.需求来源与分析 B.技术角度分析 C.具体分析步骤 1.接口协议分析 2.发邮件 3.写crontab放服 ...
- 力扣每日一题每天自动邮件提醒
A.需求来源与分析 需求来源于生活,对于只是偶尔有兴趣做做题的我,力扣的每日一题对我一直有以下的不便: 太简单不想做,需要花太多时间的不想做,每天打开力扣其实只是想看一下是什么题,有意思才做. 看题需 ...
- 力扣每日一题——两数相加II
发现做的题难度始终不高,今天Leecode给了一个稍微难一点的题目.(前两天没更是因为去拔牙了~~>_<~~) 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每 ...
- 力扣每日一题:1720.解码异或后的数组 python异或操作
1720.解码异或后的数组 https://leetcode-cn.com/problems/decode-xored-array/ 难度:简单 题目: 未知 整数数组 arr 由 n 个非负整数组成 ...
- 力扣每日一题——独一无二出现的次数
难度:简单 题目: 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数. 如果每个数的出现次数都是独一无二的,就返回 true:否则返回 false. 示例 1: 输入:arr = [1,2 ...
最新文章
- HDU1040简单排序题
- pandas使用str函数和startswith函数,筛选dataframe中(start with)以特定前缀开头的数据列(selecting columns begin with certain
- UITesting Bundle使用
- markdown错误和问题
- Vue.js组件化开发实践
- 科大星云诗社动态20210907
- 【代码】使用reentrantlock必须要手动释放锁
- Java黑皮书课后题第4章:*4.9(给出字符的Unicode码)编写程序,得到一个字符的输入,然后显示其Unicode值
- 基于JAVA+Servlet+JSP+MYSQL的保险管理系统
- 删远端分支报错remote refs do not exist或git: refusing to delete the current branch解决方法
- pytorchgpu测试_pytorch学习(十)—训练并测试CNN网络
- rsync、scp “tab” 卡顿问题
- Matplotlib从入门到精通
- python标准库——datetime模块
- UBUNTU安装后的root/su密码问题
- struts2拦截器实现登录拦截
- vue中a的href写法
- 基于51控制的人体感应灯
- 欧拉路和欧拉回路知识
- 由左右眼图片合成红蓝/红青立体图