题目
n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。
每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。
如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。
就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。
给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态,其中:
dominoes[i] = ‘L’,表示第 i 张多米诺骨牌被推向左侧,
dominoes[i] = ‘R’,表示第 i 张多米诺骨牌被推向右侧,
dominoes[i] = ‘.’,表示没有推动第 i 张多米诺骨牌。
返回表示最终状态的字符串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/push-dominoes
思路
模拟+同向双指针
假设序列的最左侧有一个L,序列的最右侧有一个R
依次分析每一对序列之间的状态
LL之间的全部向左倒
RR之间的全部向右倒
LR之间的不受影响
RL之间的左侧的向右倒,右侧的向左倒
代码
class Solution {
public:
string pushDominoes(string dominoes) {
char left='L';
int n=dominoes.size();
char right;
int i=0;
while(i<n){
int j=i;
while(i<n&&dominoes[i]=='.') i++; // 找到序列的右端点状态
if(i<n)
right=dominoes[i];
else
right='R';
if(left==right){
while(j<i) dominoes[j++]=left;
}else if(left=='R'&&right=='L'){
int k=i-1; // 防止下标越界
while(j<k){
dominoes[j++]=left;
dominoes[k--]=right;
}
}
left=right; // 上一阶段的右节点变为下一阶段的左节点
i++;
}
return dominoes;
}
};