838. 推多米諾
一行中有 N 張多米諾骨牌,我們將每張多米諾骨牌垂直豎立。
在開始時,我們同時把一些多米諾骨牌向左或向右推。
每過一秒,倒向左邊的多米諾骨牌會推動其左側相鄰的多米諾骨牌。
同樣地,倒向右邊的多米諾骨牌也會推動豎立在其右側的相鄰多米諾骨牌。
如果同時有多米諾骨牌落在一張垂直豎立的多米諾骨牌的兩邊,由於受力平衡, 該骨牌仍然保持不變。
就這個問題而言,我們會認爲正在下降的多米諾骨牌不會對其它正在下降或已經下降的多米諾骨牌施加額外的力。
給定表示初始狀態的字符串 “S” 。如果第 i 張多米諾骨牌被推向左邊,則 S[i] = ‘L’;如果第 i 張多米諾骨牌被推向右邊,則 S[i] = ‘R’;如果第 i 張多米諾骨牌沒有被推動,則 S[i] = ‘.’。
返回表示最終狀態的字符串。
示例 1:
輸入:".L.R…LR…L…"
輸出:“LL.RR.LLRRLL…”
示例 2:
輸入:“RR.L”
輸出:“RR.L”
說明:第一張多米諾骨牌沒有給第二張施加額外的力。
提示:
0 <= N <= 10^5
表示多米諾骨牌狀態的字符串只含有 ‘L’,‘R’; 以及 ‘.’;
class Solution {
public String pushDominoes(String dominoes) {
char[] d = dominoes.toCharArray();
int l = -1;
for (int r = 0; r <= d.length; r++) {
if (r == d.length || d[r] != '.') {
char charL = l == -1 ? 'L' : d[l];
char charR = r == d.length ? 'R' : d[r];
if (charL == charR) {
while (l + 1 < r)
d[++l] = charL;
} else if (charR == 'L') {
int i = r;
while (l + 2 < i) {
d[++l] = charL;
d[--i] = charR;
}
}
l = r;
}
}
return new String(d);
}
}