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. 框架进行时——SSM整合基础环境搭建

    一.导入相关的依赖 1 <!--打war包--> 2 <packaging>war</packaging> 3 4 <!--版本锁定--> 5 < ...

  2. 翻译:《实用的Python编程》03_00_Overview

    目录 | 上一节 (2 处理数据) | 下一节 (4 类和对象) 3. 程序组织 到目前为止,我们已经学习了一些 Python 基础知识并编写了一些简短的脚本.但是,当开始编写更大的程序时,我们会想要 ...

  3. vue核心---虚拟dom的实现

    生成dom的过程 由vue模板生成虚拟dom 虚拟dom转换成真实dom渲染到html页面 代码实现 要实现的真实dom <div id="box"> <p cl ...

  4. 微信小程序onReachBottom第二次失效

    当整个页面就是一个view包着一个轮播.一个横向scroll-view和一个纵向scroll-view onReachBottom方法只执行一次 解决方法:

  5. 在 .NET Core 中应用六边形架构

    在本文中,您会看到一个Web API应用的模板,在.NET Core 中应用了六边形架构,并且里面包含了一些基础功能. 介绍 这是一个模板项目,里面集成了一些必备的基础功能,当我们需要开发一个新项目时 ...

  6. Elasticsearch 为了搜索

    前言 Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene 基础之上. Lucene 可以说是当下最先进.高性能.全功能的搜索引擎库--无论是开源还是 ...

  7. JavaCV 树莓派打造监控系统平台

    使用树莓派搭建视频监控平台去年就简单的实现了,只不过功能比较简陋,最近抽时间重构了原来的平台. 环境搭建 环境部分,参考旧版的安装及配置: 树莓派搭建视频监控平台 树莓派视频监控平台实现录制归档 框架 ...

  8. python的迭代

    迭代 1:并行迭代 程序可以同时迭代两个序列 names["zhangsan","lisi","zhaosi"] age[12,13,14] ...

  9. unbutu系统扩展磁盘大小

    建议下载一个可视化工具,这样的话就更不容易出错 sudo apt install gparted 在终端中运行这条命令就可安装可视化工具 fdisk -l 在终端中输入这条命令来查看自己系统所挂载的磁 ...

  10. SSM-员工管理项目实战-CRUD-增删改查

    SSM-CRUD 一.项目简介 主界面演示 功能点 分页 数据校验 ajax Rest 风格的 URI 技术点 基础框架 - ssm(Spring + SpringMVC + MyBatis) 数据库 ...