488 Zuma Game 祖玛游戏
回忆一下祖玛游戏。现在桌上有一串球,颜色有红色(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 
标注:
    你可以假设桌上一开始的球中,不会有三个及三个以上颜色相同且连着的球。
    桌上的球不会超过20个,输入的数据中代表这些球的字符串的名字是 "board" 。
    你手中的球不会超过5个,输入的数据中代表这些球的字符串的名字是 "hand"。
    输入的两个字符串均为非空字符串,且只包含字符 'R','Y','B','G','W'。
详见:https://leetcode.com/problems/zuma-game/description/
C++:
class Solution {
public:
    int findMinStep(string board, string hand)
    {
        int res = INT_MAX;
        unordered_map<char, int> m;
        for (char c : hand)
        {
            ++m[c];
        }
        res = helper(board, m);
        return res == INT_MAX ? -1 : res;
    }
    int helper(string board, unordered_map<char, int>& m)
    {
        board = removeConsecutive(board);
        if (board.empty())
        {
            return 0;
        }
        int cnt = INT_MAX, j = 0;
        for (int i = 0; i <= board.size(); ++i)
        {
            if (i < board.size() && board[i] == board[j])
            {
                continue;
            }
            int need = 3 - (i - j);
            if (m[board[j]] >= need)
            {
                m[board[j]] -= need;
                int t = helper(board.substr(0, j) + board.substr(i), m);
                if (t != INT_MAX)
                {
                    cnt = min(cnt, t + need);
                }
                m[board[j]] += need;
            }
            j = i;
        }
        return cnt;
    }
    string removeConsecutive(string board) {
        for (int i = 0, j = 0; i <= board.size(); ++i) {
            if (i < board.size() && board[i] == board[j]) continue;
            if (i - j >= 3) return removeConsecutive(board.substr(0, j) + board.substr(i));
            else j = i;
        }
        return board;
    }
};
参考:http://www.cnblogs.com/grandyang/p/6759881.html
488 Zuma Game 祖玛游戏的更多相关文章
- [LeetCode] Zuma Game 祖玛游戏
		Think about Zuma Game. You have a row of balls on the table, colored red(R), yellow(Y), blue(B), gre ... 
- [Swift]LeetCode488. 祖玛游戏 | Zuma Game
		Think about Zuma Game. You have a row of balls on the table, colored red(R), yellow(Y), blue(B), gre ... 
- Java实现 LeetCode 488 祖玛游戏
		488. 祖玛游戏 回忆一下祖玛游戏.现在桌上有一串球,颜色有红色,黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球. 每一次,你可以从手里的球选一个,然后把这个球插入到一串 ... 
- Leetcode 488.祖玛游戏
		祖玛游戏 回忆一下祖玛游戏.现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球. 每一次,你可以从手里的球选一个,然后把这个球插入到一串球中 ... 
- T4310 祖玛游戏
		题目描述 祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干 个彩色珠子,其中任意三个相邻的珠子不会完全同色.此后,你可以发射珠子到 轨道上并加入原有序列中.一旦有三个或更多同色的珠子 ... 
- 488. Zuma Game
		Think about Zuma Game. You have a row of balls on the table, colored red(R), yellow(Y), blue(B), gre ... 
- ACM/ICPC 之 双向链表_构造列表-模拟祖玛 (TSH OJ-Zuma(祖玛))
		这一题是TsingHua OJ上的一道题目,学堂在线的一位数据结构老师的题目(原创),所以我直接把题目先贴下来了,这道题对复习双向链表很有帮助,而且也对数据结构中List,也就是对列表的回顾也是很有帮 ... 
- bzoj1032 [JSOI2007]祖码Zuma
		1032: [JSOI2007]祖码Zuma Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 672 Solved: 335[Submit][Stat ... 
- BZOJ 1032 [JSOI2007]祖码Zuma
		1032: [JSOI2007]祖码Zuma Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 637 Solved: 318[Submit][Stat ... 
随机推荐
- TC SRM 583 DIV 2
			做了俩,rating涨了80.第二个题是关于身份证的模拟题,写的时间比较长,但是我认真检查了... 第三个题是最短路,今天写了写,写的很繁琐,写的很多错. #include <cstring&g ... 
- acd - 1427 - Nice Sequence(线段树)
			题意:一个由n个数组成的序列(序列元素的范围是[0, n]).求最长前缀 j .使得在这个前缀 j 中对于随意的数 i1 < i2.都满足随意的 m <= j.i1 在前 m 个数里出现的 ... 
- mysql数据库引擎InnoDB和MyISAM的区别
			InnoDB支持行级锁和表级锁(默认行级锁),支持事务,外部键等:大量的insert和update更快等.只有通过索引条件检索数据,InnoDB 才使用行级锁,否则,InnoDB 将使用表锁. MyI ... 
- POJ3045 Cow Acrobats —— 思维证明
			题目链接:http://poj.org/problem?id=3045 Cow Acrobats Time Limit: 1000MS Memory Limit: 65536K Total Sub ... 
- JAVA 单选样式编写
			<td class="main_matter_td">管网供水情况</td> <td align="left" class=&qu ... 
- ajax验证用户名 当用户名框的数据改变时 执行ajax方法
			ajax验证用户名 当用户名框的数据改变时 执行ajax方法 <html xmlns="http://www.w3.org/1999/xhtml" ><head ... 
- c语言中为什么左移不分符号数无符号数,而右移分呢??
			因为在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移.右移都是使用的逻辑左移和逻辑右移).而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移就取决于机器了!( ... 
- git push不成功 insufficient permission for adding an object to repository database
			这常见于多用户. 1. 确保所有用户在同一个组: 2. 确保所有文件被组可读写. 当多个用户各自进行了push操作后,object目录下的文件可能各自属于各个用户. 
- windows server2012之部署HTTPS安全站点
			现在的互联网越来越重视网络安全方面的内容,像我们日常生活中浏览的网上银行网站等涉及安全的你都会发现有https 的标志出现,在URL前加https://前缀表明是用SSL加密的. 你的电脑与服务器之间 ... 
- 后缀自动机SAM  BZOJ 2806
			终于遇到了一道后缀数组不能过 一定要学SAM的题... (看了半个下午+半个上午) 现在总结一下(是给我自己总结..所以只总结了我觉得重要的 .. 看不太懂的话可以To http://blog.c ... 
