Leetcode 488.祖玛游戏

探讨了祖玛游戏中的消除策略,目标是最少步数消除所有球。通过统计手中球的数量,遍历桌面寻找连续相同的球进行消除,使用递归算法求解最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

祖玛游戏

回忆一下祖玛游戏。现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色(B),绿色(G),还有白色(W)。 现在你手里也有几个球。

每一次,你可以从手里的球选一个,然后把这个球插入到一串球中的某个位置上(包括最左端,最右端)。接着,如果有出现三个或者三个以上颜色相同的球相连的话,就把它们移除掉。重复这一步骤直到桌上所有的球都被移除。

找到插入并可以移除掉桌上所有球所需的最少的球数。如果不能移除桌上所有的球,输出 -1 。

示例:

输入: "WRRBBW", "RB"

输出: -1

解释: WRRBBW -> WRR[R]BBW -> WBBW -> WBB[B]W -> WW (翻译者标注:手上球已经用完,桌上还剩两个球无法消除,返回-1)

 

输入: "WWRRBBWW", "WRBRW"

输出: 2

解释: WWRRBBWW -> WWRR[R]BBWW -> WWBBWW -> WWBB[B]WW -> WWWW -> empty

 

输入:"G", "GGGGG"

输出: 2

解释: G -> G[G] -> GG[G] -> empty

 

输入: "RBYYBBRRB", "YRBGB"

输出: 3

解释: RBYYBBRRB -> RBYY[Y]BBRRB -> RBBBRRB -> RRRB -> B -> B[B] -> BB[B] -> empty

标注:

  1. 你可以假设桌上一开始的球中,不会有三个及三个以上颜色相同且连着的球。
  2. 桌上的球不会超过20个,输入的数据中代表这些球的字符串的名字是 "board" 。
  3. 你手中的球不会超过5个,输入的数据中代表这些球的字符串的名字是 "hand"。
  4. 输入的两个字符串均为非空字符串,且只包含字符 'R','Y','B','G','W'。

思路:

题目希望我们用最少的球来消掉桌上所有的球,如果不能完全消掉,返回-1。

我们使用哈希表来统计手中每种球的个数。

然后我们遍历桌上的球,我们找连续相同球的个数,在没有可以消除的情况下,连续的个数只能是1个或2个,然后我们用3减去连续个数,就是我们需要补充的球数以使其可以被消除,那么我们在哈希表表中看我们手中的该类型的球够不够,如果够就表示可以消除,我们在哈希表中减去需要使用掉的球数,然后将消掉的球移除。

然后对新的字符串调用递归,如果可以成功消除,会返回一个结果,该结果加上之前需要的球数用来更新结果res,注意调用完递归要恢复哈希表的状态(backtrack)。

 

Time Complexity: O(N) Space Complexity: O(N)

 

 1 class Solution {
 2     int MAXCOUNT = 6;
 3     // the max balls you need will not exceed 6 since "The number of balls in your hand won't exceed 5"
 4     public int findMinStep(String board, String hand) {
 5         int[] handCount = new int[26];
 6         for (int i = 0; i < hand.length(); i++) {
 7             handCount[hand.charAt(i) - 'A']++;
 8         }
 9         int result = backtrack(board + "#", handCount);
10         // append a "#" to avoid special process while j==board.length, make the code shorter.
11         return result == MAXCOUNT ? -1 : result;
12     }
13 
14     private int backtrack(String s, int[] h) {
15         s = removeConsecutive(s);
16         if (s.equals("#")) return 0;
17         int rs = MAXCOUNT, need = 0;
18         int i = 0;
19         for (int j = 0 ; j < s.length(); ++j) {
20             if (s.charAt(j) == s.charAt(i)) continue;
21             need = 3 - (j - i);
22             //balls need to remove current consecutive balls.
23             if (h[s.charAt(i) - 'A'] >= need) {
24                 h[s.charAt(i) - 'A'] -= need;
25                 rs = Math.min(rs, need + backtrack(s.substring(0, i) + s.substring(j), h));
26                 h[s.charAt(i) - 'A'] += need;
27             }
28             i = j;
29         }
30         return rs;
31     }
32     //remove consecutive balls longer than 3
33     private String removeConsecutive(String board) {
34         int i = 0;
35         for (int j = 0; j < board.length(); ++j) {
36             if (board.charAt(j) == board.charAt(i)) continue;
37             if (j - i >= 3) return removeConsecutive(board.substring(0, i) + board.substring(j));
38             else i = j;
39         }
40         return board;
41     }
42 }

 

### 如何在 VSCode 中安装和配置 LeetCode 插件以及 Node.js 运行环境 #### 安装 LeetCode 插件 在 VSCode 的扩展市场中搜索 `leetcode`,找到官方提供的插件并点击 **Install** 按钮进行安装[^1]。如果已经安装过该插件,则无需重复操作。 #### 下载与安装 Node.js 由于 LeetCode 插件依赖于 Node.js 环境,因此需要下载并安装 Node.js。访问官方网站 https://nodejs.org/en/ 并选择适合当前系统的版本(推荐使用 LTS 版本)。按照向导完成安装流程后,需确认 Node.js 是否成功安装到系统环境中[^2]。 可以通过命令行运行以下代码来验证: ```bash node -v npm -v ``` 上述命令应返回对应的 Node.js 和 npm 的版本号。如果没有正常返回版本信息,则可能未正确配置环境变量。 #### 解决环境路径问题 即使完成了 Node.js 的安装,仍可能出现类似 “LeetCode extension needs Node.js installed in environment path” 或者 “command ‘leetcode.toggleLeetCodeCn’ not found” 的错误提示[^3]。这通常是因为 VSCode 未能识别全局的 Node.js 路径或者本地安装的 nvm 默认版本未被正确加载[^4]。 解决方法如下: 1. 手动指定 Node.js 可执行文件的位置 在 VSCode 设置界面中输入关键词 `leetcode`,定位至选项 **Node Path**,将其值设为实际的 Node.js 安装目录下的 `node.exe` 文件位置。例如:`C:\Program Files\nodejs\node.exe`。 2. 使用 NVM 用户管理工具调整默认版本 如果通过 nvm 工具切换了不同的 Node.js 版本,请确保设置了默认使用的版本号。可通过以下指令实现: ```bash nvm alias default <version> ``` 重新启动 VSCode 后测试功能键是否恢复正常工作状态。 --- #### 配置常用刷题语言 最后一步是在 VSCode 设置面板中的 LeetCode 插件部分定义个人习惯采用的主要编程语言作为默认提交方式之一。这样可以减少频繁修改编码风格的时间成本。 --- ### 总结 综上所述,要在 VSCode 上顺利启用 LeetCode 插件及其关联服务,除了基本插件本身外还需额外准备支持性的后台框架——即 Node.js 应用程序引擎;同时针对特定场景下产生的兼容性障碍采取针对性措施加以修正即可达成目标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值