Push Dominoes

MediumTwo PointersStringDynamic Programming

Solution

export function pushDominoes(dominoes: string): string {
  const N = dominoes.length;
  const arr = dominoes.split('');
  const forces: number[] = new Array(N).fill(0);
 
  arr.reduce((force, domino, i) => {
    let nextForce: number;
    if (domino === 'R') {
      nextForce = N;
    } else if (domino === 'L') {
      nextForce = 0;
    } else {
      nextForce = Math.max(force - 1, 0);
    }
    forces[i] += nextForce;
    return nextForce;
  }, 0);
 
  arr.reduceRight((force, domino, i) => {
    let nextForce: number;
    if (domino === 'L') {
      nextForce = N;
    } else if (domino === 'R') {
      nextForce = 0;
    } else {
      nextForce = Math.max(force - 1, 0);
    }
    forces[i] -= nextForce;
    return nextForce;
  }, 0);
 
  return forces.map((force) => (force === 0 ? '.' : 0 < force ? 'R' : 'L')).join('');
}