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 -> WWInput: "WWRRBBWW", "WRBRW"
Output: 2
Explanation: WWRRBBWW -> WWRR[R]BBWW -> WWBBWW -> WWBB[B]WW -> WWWW -> emptyInput:"G", "GGGGG"
Output: 2
Explanation: G -> G[G] -> GG[G] -> emptyInput: "RBYYBBRRB", "YRBGB"
Output: 3
Explanation: RBYYBBRRB -> RBYY[Y]BBRRB -> RBBBRRB -> RRRB -> B -> B[B] -> BB[B] -> empty
Note:
- 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.
- The number of balls on the table won't exceed 20, and the string represents these balls is called "board" in the input.
- The number of balls in your hand won't exceed 5, and the string represents these balls is called "hand" in the input.
- 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的更多相关文章
- 488 Zuma Game 祖玛游戏
回忆一下祖玛游戏.现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球.每一次,你可以从手里的球选一个,然后把这个球插入到一串球中的某个位置上 ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
- leetcode 学习心得 (2) (301~516)
源代码地址:https://github.com/hopebo/hopelee 语言:C++ 301. Remove Invalid Parentheses Remove the minimum nu ...
- leetcode hard
# Title Solution Acceptance Difficulty Frequency 4 Median of Two Sorted Arrays 27.2% Hard ...
- LeetCode All in One 题目讲解汇总(转...)
终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通 ...
- bzoj1032 [JSOI2007]祖码Zuma
1032: [JSOI2007]祖码Zuma Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 672 Solved: 335[Submit][Stat ...
- Codeforces Round #336 Zuma
D. Zuma time limit per test: 2 seconds memory limit per test: 512 megabytes input: standard input ...
- 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 ...
随机推荐
- SpringBoot(八):SpringBoot中配置字符编码 Springboot中文乱码处理
SpringBoot中配置字符编码一共有两种方式 方式一: 使用传统的Spring提供的字符编码过滤器(和第二种比较,此方式复杂,由于时间原因这里先不介绍了,后续补上) 方式二(推荐使用) 在appl ...
- es6 快速入门 系列
es6 快速入门(未完结,持续更新中...) 前言 为什么要学习es6 es6对于所有javaScript开发者来说,非常重要 未来,es6将构成javaScript应用程序的基础 es6中很多特性, ...
- Java数组之选择排序
选择排序 package com.kangkang.array; import java.util.Arrays; public class demo04 { public static void m ...
- 《C++ Primer》笔记 第9章 顺序容器
顺序容器类型 类型 解释 vector 可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢 deque 双端队列.支持快速随机访问.在头尾位置插入.删除速度很快 list 双向链表 ...
- JavaWeb随笔整理
JavaWeb随笔整理 为方便阅读,故整理了相关学习笔记 前端相关 HTML CSS JavaScript BootStrap 数据库相关 MySQL基础 MySQL表的约束和数据库设计 MySQL多 ...
- Java 基础加强 02
基础加强·反射 和 枚举 类的加载概述和加载时机 * A:类的加载概述 * 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化来实现对这个类的初始化 * 加载 * 就是指 ...
- c++随机数问题研究
1.问题背景 某项目中有个复杂的排序,先是各种规则依次排序,最后如果依然并列的话,那就随机位置,名次并列.测试中发现一个诡异现象,并列时随机排序但随机后2个case打印的顺序每次都一样,随机数没有起到 ...
- Python爬虫学习三------requests+BeautifulSoup爬取简单网页
第一次第一次用MarkDown来写博客,先试试效果吧! 昨天2018俄罗斯世界杯拉开了大幕,作为一个伪球迷,当然也得为世界杯做出一点贡献啦. 于是今天就编写了一个爬虫程序将腾讯新闻下世界杯专题的相关新 ...
- Linux系统用户与用户组管理
一.用户和用户组的管理 1.新增组 groupadd 命令 格式:groupadd 组名 2.删除组 groupdel 格式:groupdel 组名 3.增加用用户命令 useradd 格式:us ...
- python基础学习之深浅复制的概念
1.深浅复制 浅复制,python自带,深复制需要导入模块包 import copy 使用深浅复制,根据id不同写出他们的区别a = [1,2,3]b = [6,7,8]s1 = [a,b]print ...