力扣解题思路:488. 祖玛游戏

488. 祖玛游戏

思路:在这里插入图片描述
实际上就是简单的消消乐,如果时间允许,最简单的暴力递归法也是可以的,就是把所有字母插入所有的位置,取最短且可以消去的插入球数即可。但是这样无脑插入是很浪费时间的,所以我们在插入的时候应该先选好合适的位置,分一下两种情况:
(1)插入一个或两个颜色相同的球引发连锁反响。
(2)往两个颜色相同的球中间插入一个颜色不同的球(为什么要这么做呢?见特殊测试用例二)。

注意两个特殊的测试用例:

测试用例一:
"WWRRGGRRWWRRGGRRWW", "GG"
无论怎么插入,都无法完全消除,结果应是-1。

测试用例二:
"RRWWRRBBRR", "WB"
"R(B)RWWRRBBRR" -> "R(B)RWW(W)RRBBRR" -> ""
结果应是2

首先我们需要一个方法来用于消去字符串,返回消去后的结果:

    private StringBuilder eliminate(StringBuilder sb) {
   
        boolean flag = true;
        while (flag) {
   
            flag = false;
            for (int i = 0; i < sb.length(); i++) {
   
                int j = i + 1;
                while (j < sb.length() && sb.charAt(j) == sb.charAt(i)) {
   
                    j++;
                }
                if (j - i >= 3) {
   
                    sb.delete(i, j);
                    flag = true;
                }
            }
        }
        return sb;
    }

我们使用Map来保存可用字符的数量,用数组或者hashMap都可以,这里为了简洁我们使用数组:

    private int result = Integer.MAX_VALUE;
    private int[] map = new int[26];
    private char[] colors = {
   'R', 'Y', 'B', 'G', 'W'};
    public int findMinStep(String board, String hand) {
   
        for (int i = 0; i < hand.length(); i++) {
   
            map[hand.charAt(i) - 'A
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值