488.祖玛游戏--leecode

题目

题目链接

思路

解决两个问题:

  1. 如何确定消除的位置。通过i,j两个下标找出颜色不同的界限,确定需要消除的球的个数。例如RRWRR,当i=0,增加j,直到j=2,此时消除RR需要3 -(j - i)=1。但是会出现一个问题,就是会存在连续消除的情况,例如此时的RRRR,遍历的时候,i=0,j=4,此时3-(j-i)=-1。这个情况在遍历的时候要注意。
  2. 连续消除的查找例如RRWWR的问题。

代码

class Solution {
public:
    int DFS(string board,map<char,int> num){
        if(board.empty()) return 0;
        int ans = 0x3f3f3f3f,l = board.length(),need,i,j;
        for(i = 0;i < l;i = j){
            j = i + 1;
            while(j < l && board[j] == board[i]) j++;
            need = 3 - (j - i);//当前位置要满足三个球消除需要几个额外的。
            if(need <= num[board[i]]){
                need = max(0,need);//可能存在有连续消除的情况。此时need为负数。例如WWWW
                num[board[i]] -= need;
                string subStr = board.substr(0,i) + board.substr(j);
                int cnt = DFS(subStr,num);
                if(cnt >= 0)
                    ans = min(ans , need + cnt);
                num[board[i]] += need;
            }
        }
        if(ans == 0x3f3f3f3f) return -1;
        else return ans;    
    }
    int findMinStep(string board, string hand) {
        map <char,int> num;//这里要定义char
        num['R']=num['Y']=num['B']=num['G']=num['W']=0;
        int l = hand.length();
        for(int i = 0;i < l;i++){
            num[hand[i]]++;
        }
        return DFS(board,num);
    }
};
发布了3 篇原创文章 · 获赞 0 · 访问量 31

猜你喜欢

转载自blog.csdn.net/free1993/article/details/104339860