Leetcode 488 Solution

This article provides solution to leetcode question 488 (zuma-game)

https://leetcode.com/problems/zuma-game

Solution

class Solution { int res; int balls[5];
public: int get_ball(char ch) { if (ch == 'R') return 0; else if (ch == 'Y') return 1; else if (ch == 'B') return 2; else if (ch == 'G') return 3; else if (ch == 'W') return 4; return 10000; }
void findMinStep(string board, int step) { stack<pair<char, int>> s; for (int i = 0; i < board.size(); i++) { if (s.empty()) s.push(make_pair(board[i], 1)); else { if (board[i] != s.top().first && s.top().second >= 3) s.pop();
if (s.empty() || board[i] != s.top().first) s.push(make_pair(board[i], 1)); else s.top().second++; } }
while (s.empty() == false && s.top().second >= 3) s.pop();
if (s.empty()) { if (res == -1 || res > step) res = step; return; }
string newboard; while (s.empty() == false) { newboard += string(s.top().second, s.top().first); s.pop(); } reverse(newboard.begin(), newboard.end());
for (int i = 0; i < newboard.size(); i++) { if (i + 1 < newboard.size() && newboard[i] == newboard[i + 1]) continue;
auto ball = get_ball(newboard[i]); if (balls[ball] > 0) { balls[ball]--; findMinStep(newboard.substr(0, i + 1) + newboard[i] + newboard.substr(i + 1), step + 1); balls[ball]++; } } }
int findMinStep(string board, string hand) { res = -1; balls[0] = 0; balls[1] = 0; balls[2] = 0; balls[3] = 0; balls[4] = 0;
for (auto ball : hand) balls[get_ball(ball)]++;
findMinStep(board, 0);
return res; } };