Push Dominoes

medium string two-pointers simulation

Problem

A row of dominoes contains 'L', 'R', or '.'. Each second, an upright domino falls in the direction of an adjacent pushed one. If both directions push it simultaneously, it stays upright. Return the final state.

Inputdominoes = ".L.R...LR..L.."
Output"LL.RR.LLRRLL.."
Forces from L and R propagate symmetrically.

def pushDominoes(d):
    s = "L" + d + "R"
    res = []
    prev = 0
    for i in range(1, len(s)):
        if s[i] == ".": continue
        mid = i - prev - 1
        if s[prev] == s[i]:
            res.append(s[i] * mid)
        elif s[prev] == "L" and s[i] == "R":
            res.append("." * mid)
        else:
            res.append("R" * (mid // 2) + ("." if mid % 2 else "") + "L" * (mid // 2))
        if i < len(s) - 1:
            res.append(s[i])
        prev = i
    return "".join(res)
function pushDominoes(d) {
  const s = "L" + d + "R";
  const parts = [];
  let prev = 0;
  for (let i = 1; i < s.length; i++) {
    if (s[i] === ".") continue;
    const mid = i - prev - 1;
    if (s[prev] === s[i]) parts.push(s[i].repeat(mid));
    else if (s[prev] === "L" && s[i] === "R") parts.push(".".repeat(mid));
    else parts.push("R".repeat(mid >> 1) + (mid % 2 ? "." : "") + "L".repeat(mid >> 1));
    if (i < s.length - 1) parts.push(s[i]);
    prev = i;
  }
  return parts.join("");
}
class Solution {
  public String pushDominoes(String d) {
    String s = "L" + d + "R";
    StringBuilder sb = new StringBuilder();
    int prev = 0;
    for (int i = 1; i < s.length(); i++) {
      if (s.charAt(i) == '.') continue;
      int mid = i - prev - 1;
      char a = s.charAt(prev), b = s.charAt(i);
      if (a == b) for (int k = 0; k < mid; k++) sb.append(a);
      else if (a == 'L' && b == 'R') for (int k = 0; k < mid; k++) sb.append('.');
      else { for (int k = 0; k < mid / 2; k++) sb.append('R'); if (mid % 2 == 1) sb.append('.'); for (int k = 0; k < mid / 2; k++) sb.append('L'); }
      if (i < s.length() - 1) sb.append(b);
      prev = i;
    }
    return sb.toString();
  }
}
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
    string pushDominoes(string d) {
        string s = "L" + d + "R";
        string out;
        int prev = 0;
        for (int i = 1; i < (int)s.size(); i++) {
            if (s[i] == '.') continue;
            int mid = i - prev - 1;
            char a = s[prev], b = s[i];
            if (a == b) out += string(mid, a);
            else if (a == 'L' && b == 'R') out += string(mid, '.');
            else out += string(mid / 2, 'R') + string(mid % 2, '.') + string(mid / 2, 'L');
            if (i < (int)s.size() - 1) out += b;
            prev = i;
        }
        return out;
    }
};
Time: O(n) Space: O(n)