-
Notifications
You must be signed in to change notification settings - Fork 35
Expand file tree
/
Copy pathpush-dominoes.java
More file actions
85 lines (65 loc) · 2.96 KB
/
push-dominoes.java
File metadata and controls
85 lines (65 loc) · 2.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*Question:-There are n dominoes in a line, and we place each domino vertically upright. In the beginning, we simultaneously push some of the dominoes either to the left or to the right.
After each second, each domino that is falling to the left pushes the adjacent domino on the left. Similarly, the dominoes falling to the right push their adjacent dominoes standing on the right.
When a vertical domino has dominoes falling on it from both sides, it stays still due to the balance of the forces.
For the purposes of this question, we will consider that a falling domino expends no additional force to a falling or already fallen domino.
You are given a string dominoes representing the initial state where:
dominoes[i] = 'L', if the ith domino has been pushed to the left,
dominoes[i] = 'R', if the ith domino has been pushed to the right, and
dominoes[i] = '.', if the ith domino has not been pushed.
Return a string representing the final state.*/
class Solution {
public String pushDominoes(String dominoes) {
StringBuilder sb = new StringBuilder(dominoes);
int n = sb.length();
//mark true for all the unpushed block, after pushing a bloch in right direction
char prev = '.';
boolean[] forward = new boolean[n];
for(int i = 0; i < n; i++){
char c = dominoes.charAt(i);
if(c == '.'){
if(prev == 'R') forward[i] = true;
}else{
prev = c;
}
}
//mark true for all the unpushed block, after pushing a block in left direction
prev = '.';
boolean[] backward = new boolean[n];
for(int i = n - 1; i >= 0; i--){
char c = dominoes.charAt(i);
if(c == '.'){
if(prev == 'L') backward[i] = true;
}else{
prev = c;
}
}
int i = 0;
while(i < n){
if(backward[i] && !forward[i]){
//fall block as there is force in left direction
sb.setCharAt(i++, 'L');
}else if(!backward[i] && forward[i]){
//fall block as there is force in right direction
sb.setCharAt(i++, 'R');
}else if(backward[i] && forward[i]){
//fall block as there is force in both direction
int j = (i + 1);
while(j < n && backward[j] && forward[j]){
j++;
}
pushDominoesInBetween(sb, i, j - 1);
i = j;
}else{
i++;
}
}
return sb.toString();
}
private void pushDominoesInBetween(StringBuilder sb, int l, int r){
while(l < r){
sb.setCharAt(l++, 'R');
sb.setCharAt(r--, 'L');
}
}
}
//submission link:-https://leetcode.com/submissions/detail/809846444/