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