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

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

  • 从你手上的彩球中选出 任意一颗 ,然后将其插入桌面上那一排球中:两球之间或这一排球的任一端。
  • 接着,如果有出现 三个或者三个以上 且 颜色相同 的球相连的话,就把它们移除掉。
    • 如果这种移除操作同样导致出现三个或者三个以上且颜色相同的球相连,则可以继续移除这些球,直到不再满足移除条件。
  • 如果桌面上所有球都被移除,则认为你赢得本场游戏。
  • 重复这个过程,直到你赢了游戏或者手中没有更多的球。

给你一个字符串 board ,表示桌面上最开始的那排球。另给你一个字符串 hand ,表示手里的彩球。请你按上述操作步骤移除掉桌上所有球,计算并返回所需的 最少 球数。如果不能移除桌上所有的球,返回 -1 。

示例 1:

输入:board = "WRRBBW", hand = "RB"
输出:-1
解释:无法移除桌面上的所有球。可以得到的最好局面是:
- 插入一个 'R' ,使桌面变为 WRRRBBW 。WRRRBBW -> WBBW
- 插入一个 'B' ,使桌面变为 WBBBW 。WBBBW -> WW
桌面上还剩着球,没有其他球可以插入。

示例 2:

输入:board = "WWRRBBWW", hand = "WRBRW"
输出:2
解释:要想清空桌面上的球,可以按下述步骤:
- 插入一个 'R' ,使桌面变为 WWRRRBBWW 。WWRRRBBWW -> WWBBWW
- 插入一个 'B' ,使桌面变为 WWBBBWW 。WWBBBWW -> WWWW -> empty
只需从手中出 2 个球就可以清空桌面。

示例 3:

输入:board = "G", hand = "GGGGG"
输出:2
解释:要想清空桌面上的球,可以按下述步骤:
- 插入一个 'G' ,使桌面变为 GG 。
- 插入一个 'G' ,使桌面变为 GGGGGG -> empty
只需从手中出 2 个球就可以清空桌面。

示例 4:

输入:board = "RBYYBBRRB", hand = "YRBGB"
输出:3
解释:要想清空桌面上的球,可以按下述步骤:
- 插入一个 'Y' ,使桌面变为 RBYYYBBRRB 。RBYYYBBRRB -> RBBBRRB -> RRRB -> B
- 插入一个 'B' ,使桌面变为 BB 。
- 插入一个 'B' ,使桌面变为 BBBBBB -> empty
只需从手中出 3 个球就可以清空桌面。
public class Solution {public int findMinStep(String board, String hand) {List<Character> boards = new ArrayList<>();for (char c: board.toCharArray()) {boards.add(c);}Map<Character, Integer> hands = new HashMap<>();hands.put('R', 0);hands.put('Y', 0);hands.put('B', 0);hands.put('G', 0);hands.put('W', 0);for (char h: hand.toCharArray()) {hands.put(h, hands.get(h) + 1);}return find(boards, hands);}public int find(List<Character> boards, Map<Character, Integer> hands) {clearBoard(boards);if (boards.size() <= 0) {return 0;}if (empty(hands)) {return -1;}int count = 0;int min = Integer.MAX_VALUE;for (int i = 0; i < boards.size(); i++) {Character c = boards.get(i);count++;if (i >= boards.size() - 1 || boards.get(i + 1) != c) {int need = 3 - count;if (hands.get(c) >= need) {List<Character> small = new ArrayList<>(boards);for (int j = 0; j < count; j++) {small.remove(i - j);}hands.put(c, hands.get(c) - need);int smallerFind = find(small, hands);if (smallerFind > -1) {min = Math.min(min, smallerFind + need);}hands.put(c, hands.get(c) + need);}count = 0;}}return (min == Integer.MAX_VALUE) ? -1 : min;}private void clearBoard(List<Character> board) {int count = 0;boolean cleaned = false;for (int i = 0; i < board.size(); i++) {char c = board.get(i);count++;if (i == board.size() - 1 || board.get(i + 1) != c) {if (count >= 3) {for (int j = 0; j < count; j++) {board.remove(i - j);}cleaned = true;break;}count = 0;}}if (cleaned) {clearBoard(board);}}private boolean empty(Map<Character, Integer> hand) {for (int val: hand.values()) {if (val > 0)return false;}return true;}
}

leetcode刷题----祖玛游戏(14)相关推荐

  1. LeetCode刷题7--Nim游戏

    LeetCode刷题笔记7 292. Nim 游戏 题目描述 思路: 代码 292. Nim 游戏 链接 题目描述 你和你的朋友,两个人一起玩 Nim 游戏: 桌子上有一堆石头. 你们轮流进行自己的回 ...

  2. LeetCode刷题——消除游戏#390#Medium

    消除游戏的思路探讨与源码     消除游戏的题目如下图,该题属于递归类和数学类型的题目,主要考察对于数学方法的使用和递归方法的理解.本文的题目作者想到2种方法,分别是递归方法和数学模拟方法,其中递归方 ...

  3. leetcode刷题之 树(14)-递归:找出二叉树中第二小的节点

    [LeetCode] Second Minimum Node In a Binary Tree 二叉树中第二小的结点 Given a non-empty special binary tree con ...

  4. ​LeetCode刷题实战488:祖玛游戏

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  5. LeetCode刷题记录14——257. Binary Tree Paths(easy)

    LeetCode刷题记录14--257. Binary Tree Paths(easy) 目录 前言 题目 语言 思路 源码 后记 前言 数据结构感觉理论简单,实践起来很困难. 题目 给定一个二叉树, ...

  6. ​LeetCode刷题实战174:地下城游戏

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  7. C#LeetCode刷题-数学

    数学篇 # 题名 刷题 通过率 难度 2 两数相加 29.0% 中等 7 反转整数 C#LeetCode刷题之#7-反转整数(Reverse Integer) 28.6% 简单 8 字符串转整数 (a ...

  8. leetcode刷题目录总结

    题目 题目 技巧 相似的题目 其他 1. 无序数组中找出目标为target的两个数 先定义下一个数,然后找两位的数是否存在 高频, 大厂刷题班, 第27节 2.逆序链表两数相加 链表.各位加法 高频, ...

  9. LeetCode 刷题之路(python版)

    摘自:https://blog.csdn.net/qq_32384313/article/details/90745354 LeetCode 刷题之路(python版) 小坏wz 2019-06-02 ...

最新文章

  1. 程序员福音-定时提醒bat
  2. ABAP基础类型温习
  3. Oracle入门(十二)之SQL的DDL
  4. if中有return理解
  5. Vue三大核心概念之二(事件)
  6. 动态规划-有关计数问题的DP-多重集组合数
  7. 手机app登录显示服务器异常,手机app 连接云服务器异常
  8. 前端工程师月薪上万的秘密
  9. 【Python】一个简陋的基于混淆矩阵计算遥感分类精度(总体精度、Kappa系数、用户精度、生产者精度等)的代码
  10. 【雷达信号处理】脉冲多普勒PD及其MATLAB实现
  11. 企业成本费用空缺如何解决?享受核定政策一招搞定!
  12. Evernote 印象笔记离线使用方法
  13. Alpha阶段敏捷冲刺④
  14. 【2021情人节主题征文】| 写了一个表白网页后,我跟女神在一起啦
  15. 第7讲 替代定理、戴维南定理、诺顿定理
  16. 数据挖掘与数据分析(快速入门)
  17. openEuler操作系统的安装
  18. aspx文件怎么用服务器打开,高手教你轻松打开ASPX文件【图文教程】
  19. Exception in thread “main“ java.io.FileNotFoundException: test\mybatis-config.xml (系统找不到指定的路径。)
  20. ubuntu20下Cuckoo SandBox安装教程--大踩坑版(一)

热门文章

  1. 路由器DNS 劫持攻击情况
  2. 设计模式之一工厂模式
  3. 联发科、联芯TD合作后期走势分析
  4. win git 报错 no matching host key type found. Their offer: ssh-rsa
  5. r语言boxcox异方差_基于R语言进行Box-Cox变换
  6. Mac的app store打开白屏解决方法
  7. POE原理,千兆POE供电分离方案
  8. 喵星球上的点名——记一个用广义SAM根号维护多串的技巧
  9. 用例测试(三)——边界值分析法
  10. 因果推理(八):工具变量(Intrusmental Variables)