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].

class Solution {
int ret = Integer.MAX_VALUE; public int findMinStep(String board, String hand) { dfs(board, hand, 0); return ret == Integer.MAX_VALUE ? -1 : ret;
} public void dfs(String board, String hand, int cur) {
if (dontHave(hand) && board.length() != 0) return;
if (board == null && board.length() == 0)
ret = Math.min(ret, cur); if (board.length() < 2 && inHand(hand, board.charAt(0))) {
board += board.charAt(0);
dfs(board, hand, cur+1);
} for (int i = 1; i < board.length(); ++i) {
StringBuilder copy = new StringBuilder(board);
boolean isChange = false; if (board.charAt(i) == board.charAt(i-1) && inHand(hand, board.charAt(i))) {
copy.deleteCharAt(i-1);
copy.deleteCharAt(i-1);
String temp = trim(copy);
dfs(temp, hand, cur+1);
isChange = true;
} // recover
if (isChange) {
hand += board.charAt(i);
}
}
} public String trim(StringBuilder temp) {
if (temp == null || temp.length() == 0) return "";
int count = 1;
for (int i = 1; i < temp.length(); ++i) {
if (temp.charAt(i-1) == temp.charAt(i)) {
count++;
} else {
if (count >= 3) {
int lastPos = i - count;
return trim(temp.delete(lastPos, i));
}
count = 1;
}
}
return temp.toString();
} public boolean inHand(String hand, Character c) {
for (int i = 0; i < hand.length(); ++i) {
if (hand.charAt(i) == c) {
hand.charAt(i) = '#';
return true;
}
}
return false;
} public boolean dontHave(String hand) {
for (int i = 0; i < hand.length(); ++i) {
if (hand.charAt(i) != '#') return false;
}
return true;
}
}

  

Approach #2: DFS. [Java]

class Solution {
int MaxNum = 6; public int findMinStep(String board, String hand) {
int ret = MaxNum;
int[] handCount = new int[26];
for (int i = 0; i < hand.length(); ++i)
handCount[hand.charAt(i) - 'A']++; ret = dfs(board+"#", handCount); return ret == MaxNum ? -1 : ret;
} public int dfs(String s, int[] h) {
s = removeConsecutives(s);
if (s.equals("#")) return 0;
int rs = MaxNum, need = 0;
for (int i = 0, j = 0; j < s.length(); ++j) {
if (s.charAt(i) == s.charAt(j)) continue;
need = 3 - (j - i);
if (h[s.charAt(i)-'A'] >= need) {
h[s.charAt(i)-'A'] -= need;
rs = Math.min(rs, need + dfs(s.substring(0, i) + s.substring(j), h));
h[s.charAt(i)-'A'] += need;
}
i = j;
}
return rs;
} public String removeConsecutives(String s) {
for (int i = 0, j = 0; j < s.length(); ++j) {
if (s.charAt(i) == s.charAt(j)) continue;
if (j - i >= 3) {
return removeConsecutives(s.substring(0, i) + s.substring(j));
} else i = j;
}
return s;
} }

  

Reference:

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

488. Zuma Game的更多相关文章

  1. 488 Zuma Game 祖玛游戏

    回忆一下祖玛游戏.现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球.每一次,你可以从手里的球选一个,然后把这个球插入到一串球中的某个位置上 ...

  2. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  3. All LeetCode Questions List 题目汇总

    All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...

  4. leetcode 学习心得 (2) (301~516)

    源代码地址:https://github.com/hopebo/hopelee 语言:C++ 301. Remove Invalid Parentheses Remove the minimum nu ...

  5. leetcode hard

    # Title Solution Acceptance Difficulty Frequency     4 Median of Two Sorted Arrays       27.2% Hard ...

  6. LeetCode All in One 题目讲解汇总(转...)

    终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通 ...

  7. bzoj1032 [JSOI2007]祖码Zuma

    1032: [JSOI2007]祖码Zuma Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 672  Solved: 335[Submit][Stat ...

  8. Codeforces Round #336 Zuma

    D. Zuma time limit per test:  2 seconds memory limit per test:  512 megabytes input:  standard input ...

  9. Codeforces Round #336 (Div. 2) D. Zuma 区间dp

    D. Zuma   Genos recently installed the game Zuma on his phone. In Zuma there exists a line of n gems ...

随机推荐

  1. LiteOS:SpinLock自旋锁及LockDep死锁检测

    摘要:除了多核的自旋锁机制,本文会介绍下LiteOS 5.0引入的LockDep死锁检测特性. 2020年12月发布的LiteOS 5.0推出了全新的内核,支持SMP多核调度功能.想学习SMP多核调度 ...

  2. 后端程序员之路 34、Index搜索引擎实现分析3-对文章索引的两层分块

    # part_indexer 对文章根据id的hash进行分块索引- 持有 search_index _inc_index[2]; search_index _history_index[2]; 进行 ...

  3. 记一次Drone无法触发构建的问题

    问题 好巧不巧,当你晚上准备上线的时候,在下午临近下班的时候CI&CD工具出问题了,提交代码不能触发构建,不能上线了,Drone平台那边也下班了,正好CICD依赖的公司git仓库也出问题了(就 ...

  4. Java 语言基础 02

    语言基础·二级 顺序结构语句 * A:什么是流程控制语句    * 流程控制语句:可以控制程序的执行流程. * B:流程控制语句的分类    * 顺序结构    * 选择结构    * 循环结构 *  ...

  5. Fastjson1.2.24RCE漏洞复现

    Fastjson1.2.24RCE漏洞复现 环境搭建 这里用的Vulhub靶场 cd /vulhub/fastjson/1.2.24-rce docker-compose up -d 报错 ERROR ...

  6. python的模块(module)和包(package)机制:import和from..import..

    在python用import或者from...import来导入相应的模块. 模块其实就一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中 ...

  7. windows电脑上传ipa到appstore的详细流程

    在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布. 但是在苹果开发者中心无法直接上传ipa文件,它要求我们使用xcode或transpo ...

  8. FreeBSD 的xfce 终端动态标题不显示问题解决了:

    tcsh配置,home目录创建.tcshrc, 写入以下配置 alias h history 25 alias j jobs -l alias la ls -aF alias lf ls -FA al ...

  9. python 常用的库

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...

  10. [源码分析] 消息队列 Kombu 之 Hub

    [源码分析] 消息队列 Kombu 之 Hub 0x00 摘要 本系列我们介绍消息队列 Kombu.Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象.通过本文,大家可以了解 Kombu 中的 ...