488. Zuma Game

Think about Zuma Game. You have a row of balls on the table, colored red(R), yellow(Y), blue(B), green(G), and white(W). You also have several balls in your hand.

Each time, you may choose a ball in your hand, and insert it into the row (including the leftmost place and rightmost place). Then, if there is a group of 3 or more balls in the same color touching, remove these balls. Keep doing this until no more balls can be removed.

Find the minimal balls you have to insert to remove all the balls on the table. If you cannot remove all the balls, output -1.

 

Examples:
Input: "WRRBBW", "RB" Output: -1 Explanation: WRRBBW -> WRR[R]BBW -> WBBW -> WBB[B]W -> WW Input: "WWRRBBWW", "WRBRW" Output: 2 Explanation: WWRRBBWW -> WWRR[R]BBWW -> WWBBWW -> WWBB[B]WW -> WWWW -> empty Input:"G", "GGGGG" Output: 2 Explanation: G -> G[G] -> GG[G] -> empty Input: "RBYYBBRRB", "YRBGB" Output: 3 Explanation: RBYYBBRRB -> RBYY[Y]BBRRB -> RBBBRRB -> RRRB -> B -> B[B] -> BB[B] -> empty

 

Note:

  1. You may assume that the initial row of balls on the table won’t have any 3 or more consecutive balls with the same color.
  2. The number of balls on the table won't exceed 20, and the string represents these balls is called "board" in the input.
  3. The number of balls in your hand won't exceed 5, and the string represents these balls is called "hand" in the input.
  4. Both input strings will be non-empty and only contain characters 'R','Y','B','G','W'.

 

Approach #1: DFS. [My Code][Wrong].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<code-pre class="code-pre code-pre-line" id="pre-Rfxnb6"><code-line class="line-numbers-rows"></code-line>class Solution {
<code-line class="line-numbers-rows"></code-line>    int ret = Integer.MAX_VALUE;
<code-line class="line-numbers-rows"></code-line>   
<code-line class="line-numbers-rows"></code-line>    public int findMinStep(String board, String hand) {
<code-line class="line-numbers-rows"></code-line>       
<code-line class="line-numbers-rows"></code-line>        dfs(board, hand, 0);
<code-line class="line-numbers-rows"></code-line>       
<code-line class="line-numbers-rows"></code-line>       
<code-line class="line-numbers-rows"></code-line>        return ret == Integer.MAX_VALUE ? -1 : ret;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>   
<code-line class="line-numbers-rows"></code-line>    public void dfs(String board, String hand, int cur) {
<code-line class="line-numbers-rows"></code-line>        if (dontHave(hand) && board.length() != 0) return;
<code-line class="line-numbers-rows"></code-line>        if (board == null && board.length() == 0)
<code-line class="line-numbers-rows"></code-line>            ret = Math.min(ret, cur);
<code-line class="line-numbers-rows"></code-line>       
<code-line class="line-numbers-rows"></code-line>       
<code-line class="line-numbers-rows"></code-line>        if (board.length() < 2 && inHand(hand, board.charAt(0))) {
<code-line class="line-numbers-rows"></code-line>            board += board.charAt(0);
<code-line class="line-numbers-rows"></code-line>            dfs(board, hand, cur+1);
<code-line class="line-numbers-rows"></code-line>        }
<code-line class="line-numbers-rows"></code-line>       
<code-line class="line-numbers-rows"></code-line>        for (int i = 1; i < board.length(); ++i) {
<code-line class="line-numbers-rows"></code-line>            StringBuilder copy = new StringBuilder(board);
<code-line class="line-numbers-rows"></code-line>            boolean isChange = false;
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>            if (board.charAt(i) == board.charAt(i-1) && inHand(hand, board.charAt(i))) {
<code-line class="line-numbers-rows"></code-line>                copy.deleteCharAt(i-1);
<code-line class="line-numbers-rows"></code-line>                copy.deleteCharAt(i-1);
<code-line class="line-numbers-rows"></code-line>                String temp = trim(copy);
<code-line class="line-numbers-rows"></code-line>                dfs(temp, hand, cur+1);
<code-line class="line-numbers-rows"></code-line>                isChange = true;
<code-line class="line-numbers-rows"></code-line>            }
<code-line class="line-numbers-rows"></code-line>           
<code-line class="line-numbers-rows"></code-line>            // recover
<code-line class="line-numbers-rows"></code-line>            if (isChange) {
<code-line class="line-numbers-rows"></code-line>                hand += board.charAt(i);
<code-line class="line-numbers-rows"></code-line>            }
<code-line class="line-numbers-rows"></code-line>        }
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>   
<code-line class="line-numbers-rows"></code-line>    public String trim(StringBuilder temp) {
<code-line class="line-numbers-rows"></code-line>        if (temp == null || temp.length() == 0) return "";
<code-line class="line-numbers-rows"></code-line>        int count = 1;
<code-line class="line-numbers-rows"></code-line>        for (int i = 1; i < temp.length(); ++i) {
<code-line class="line-numbers-rows"></code-line>            if (temp.charAt(i-1) == temp.charAt(i)) {
<code-line class="line-numbers-rows"></code-line>                count++;
<code-line class="line-numbers-rows"></code-line>            } else {
<code-line class="line-numbers-rows"></code-line>                if (count >= 3) {
<code-line class="line-numbers-rows"></code-line>                    int lastPos = i - count;
<code-line class="line-numbers-rows"></code-line>                    return trim(temp.delete(lastPos, i));
<code-line class="line-numbers-rows"></code-line>                }
<code-line class="line-numbers-rows"></code-line>                count = 1;
<code-line class="line-numbers-rows"></code-line>            }
<code-line class="line-numbers-rows"></code-line>        }
<code-line class="line-numbers-rows"></code-line>        return temp.toString();
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>   
<code-line class="line-numbers-rows"></code-line>    public boolean inHand(String hand, Character c) {
<code-line class="line-numbers-rows"></code-line>        for (int i = 0; i < hand.length(); ++i) {
<code-line class="line-numbers-rows"></code-line>            if (hand.charAt(i) == c) {
<code-line class="line-numbers-rows"></code-line>                hand.charAt(i) = '#';
<code-line class="line-numbers-rows"></code-line>                return true;
<code-line class="line-numbers-rows"></code-line>            }
<code-line class="line-numbers-rows"></code-line>        }
<code-line class="line-numbers-rows"></code-line>        return false;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>   
<code-line class="line-numbers-rows"></code-line>    public boolean dontHave(String hand) {
<code-line class="line-numbers-rows"></code-line>        for (int i = 0; i < hand.length(); ++i) {
<code-line class="line-numbers-rows"></code-line>            if (hand.charAt(i) != '#') return false;
<code-line class="line-numbers-rows"></code-line>        }
<code-line class="line-numbers-rows"></code-line>        return true;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>}
</code-pre>

  

Approach #2: DFS. [Java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<code-pre class="code-pre code-pre-line" id="pre-n62Trs"><code-line class="line-numbers-rows"></code-line>class Solution {
<code-line class="line-numbers-rows"></code-line>    int MaxNum = 6;
<code-line class="line-numbers-rows"></code-line>   
<code-line class="line-numbers-rows"></code-line>    public int findMinStep(String board, String hand) {
<code-line class="line-numbers-rows"></code-line>        int ret = MaxNum;
<code-line class="line-numbers-rows"></code-line>        int[] handCount = new int[26];
<code-line class="line-numbers-rows"></code-line>        for (int i = 0; i < hand.length(); ++i)
<code-line class="line-numbers-rows"></code-line>            handCount[hand.charAt(i) - 'A']++;
<code-line class="line-numbers-rows"></code-line>       
<code-line class="line-numbers-rows"></code-line>        ret = dfs(board+"#", handCount);
<code-line class="line-numbers-rows"></code-line>       
<code-line class="line-numbers-rows"></code-line>        return ret == MaxNum ? -1 : ret;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>   
<code-line class="line-numbers-rows"></code-line>    public int dfs(String s, int[] h) {
<code-line class="line-numbers-rows"></code-line>        s = removeConsecutives(s);
<code-line class="line-numbers-rows"></code-line>        if (s.equals("#")) return 0;
<code-line class="line-numbers-rows"></code-line>        int rs = MaxNum, need = 0;
<code-line class="line-numbers-rows"></code-line>        for (int i = 0, j = 0; j < s.length(); ++j) {
<code-line class="line-numbers-rows"></code-line>            if (s.charAt(i) == s.charAt(j)) continue;
<code-line class="line-numbers-rows"></code-line>            need = 3 - (j - i);
<code-line class="line-numbers-rows"></code-line>            if (h[s.charAt(i)-'A'] >= need) {
<code-line class="line-numbers-rows"></code-line>                h[s.charAt(i)-'A'] -= need;
<code-line class="line-numbers-rows"></code-line>                rs = Math.min(rs, need + dfs(s.substring(0, i) + s.substring(j), h));
<code-line class="line-numbers-rows"></code-line>                h[s.charAt(i)-'A'] += need;
<code-line class="line-numbers-rows"></code-line>            }
<code-line class="line-numbers-rows"></code-line>            i = j;
<code-line class="line-numbers-rows"></code-line>        }
<code-line class="line-numbers-rows"></code-line>        return rs;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>   
<code-line class="line-numbers-rows"></code-line>    public String removeConsecutives(String s) {
<code-line class="line-numbers-rows"></code-line>        for (int i = 0, j = 0; j < s.length(); ++j) {
<code-line class="line-numbers-rows"></code-line>            if (s.charAt(i) == s.charAt(j)) continue;
<code-line class="line-numbers-rows"></code-line>            if (j - i >= 3) {
<code-line class="line-numbers-rows"></code-line>                return removeConsecutives(s.substring(0, i) + s.substring(j));
<code-line class="line-numbers-rows"></code-line>            } else i = j;
<code-line class="line-numbers-rows"></code-line>        }
<code-line class="line-numbers-rows"></code-line>        return s;
<code-line class="line-numbers-rows"></code-line>    }
<code-line class="line-numbers-rows"></code-line>   
<code-line class="line-numbers-rows"></code-line>   
<code-line class="line-numbers-rows"></code-line>}
</code-pre>

  

Reference:

https://leetcode.com/problems/zuma-game/discuss/97010/%22short%22-java-solution-beats-98

 


__EOF__

本文作者Veritas des Liberty
本文链接https://www.cnblogs.com/h-hkai/p/10957569.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Veritas_des_Liberty  阅读(24189)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示