Skip to content

Instantly share code, notes, and snippets.

@SuryaPratapK
Created May 2, 2025 12:03
Show Gist options
  • Save SuryaPratapK/a3323409c8a7071a53763ae0a768e8bc to your computer and use it in GitHub Desktop.
Save SuryaPratapK/a3323409c8a7071a53763ae0a768e8bc to your computer and use it in GitHub Desktop.
class Domino {
public:
void doubleDominoPush(int last_R, int pos, string& dominoes) {
while (last_R < pos) {
dominoes[last_R++] = 'R';
dominoes[pos--] = 'L';
}
}
void leftDominoPush(int start, int end, string& dominoes) {
while (start <= end)
dominoes[start++] = 'L';
}
void rightDominoPush(int last_R, int pos, string& dominoes) {
while (last_R <= pos)
dominoes[last_R++] = 'R';
}
};
class Solution {
public:
string pushDominoes(string dominoes) {
Domino newDomino; // Removed 'new' since we're not using pointers
int last_L = -1, last_R = -1;
int n = dominoes.size();
for (int pos = 0; pos < n; pos++) {
if (dominoes[pos] == 'L') {
if (last_R > last_L) {
newDomino.doubleDominoPush(last_R, pos, dominoes);
}
else if ((last_L > last_R) || last_L == -1) {
newDomino.leftDominoPush(last_L + 1, pos, dominoes);
}
last_L = pos;
}
else if (dominoes[pos] == 'R') {
if (last_R > last_L) {
newDomino.rightDominoPush(last_R, pos, dominoes);
}
last_R = pos;
}
}
// Final case: (R)RR...R(end)
if (last_R > last_L)
newDomino.rightDominoPush(last_R, n - 1, dominoes);
return dominoes;
}
};
/*
//JAVA
class Domino {
public void doubleDominoPush(int last_R, int pos, StringBuilder dominoes) {
while (last_R < pos) {
dominoes.setCharAt(last_R++, 'R');
dominoes.setCharAt(pos--, 'L');
}
}
public void leftDominoPush(int start, int end, StringBuilder dominoes) {
while (start <= end) {
dominoes.setCharAt(start++, 'L');
}
}
public void rightDominoPush(int last_R, int pos, StringBuilder dominoes) {
while (last_R <= pos) {
dominoes.setCharAt(last_R++, 'R');
}
}
}
class Solution {
public String pushDominoes(String dominoes) {
Domino newDomino = new Domino();
int last_L = -1, last_R = -1;
int n = dominoes.length();
StringBuilder sb = new StringBuilder(dominoes);
for (int pos = 0; pos < n; pos++) {
if (sb.charAt(pos) == 'L') {
if (last_R > last_L) {
newDomino.doubleDominoPush(last_R, pos, sb);
}
else if ((last_L > last_R) || last_L == -1) {
newDomino.leftDominoPush(last_L + 1, pos, sb);
}
last_L = pos;
}
else if (sb.charAt(pos) == 'R') {
if (last_R > last_L) {
newDomino.rightDominoPush(last_R, pos, sb);
}
last_R = pos;
}
}
// Final case: (R)RR...R(end)
if (last_R > last_L) {
newDomino.rightDominoPush(last_R, n - 1, sb);
}
return sb.toString();
}
}
#Python
class Domino:
def doubleDominoPush(self, last_R, pos, dominoes):
dominoes_list = list(dominoes)
while last_R < pos:
dominoes_list[last_R] = 'R'
dominoes_list[pos] = 'L'
last_R += 1
pos -= 1
return ''.join(dominoes_list)
def leftDominoPush(self, start, end, dominoes):
dominoes_list = list(dominoes)
while start <= end:
dominoes_list[start] = 'L'
start += 1
return ''.join(dominoes_list)
def rightDominoPush(self, last_R, pos, dominoes):
dominoes_list = list(dominoes)
while last_R <= pos:
dominoes_list[last_R] = 'R'
last_R += 1
return ''.join(dominoes_list)
class Solution:
def pushDominoes(self, dominoes: str) -> str:
newDomino = Domino()
last_L = -1
last_R = -1
n = len(dominoes)
result = dominoes
for pos in range(n):
if result[pos] == 'L':
if last_R > last_L:
result = newDomino.doubleDominoPush(last_R, pos, result)
elif (last_L > last_R) or (last_L == -1):
result = newDomino.leftDominoPush(last_L + 1, pos, result)
last_L = pos
elif result[pos] == 'R':
if last_R > last_L:
result = newDomino.rightDominoPush(last_R, pos, result)
last_R = pos
# Final case: (R)RR...R(end)
if last_R > last_L:
result = newDomino.rightDominoPush(last_R, n - 1, result)
return result
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment