838. 推多米诺 https://leetcode-cn.com/problems/push-dominoes/
一行中有 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'
; 以及 '.'
;
思路:根据题意,找到那些可以倒,一步一步倒塌,如果输出,就是其倒塌过程。两边加上“..”,便于处理.
但是对于情况“"R.R.L"”应该为“RRR.L”需要注意。
另外,不能使用一个字符串,需要d1,d2,否则 “R..L
” 处理就错误了。
class Solution {
public:
string pushDominoes(string dominoes) {
int n=dominoes.size();
string d1=".."+dominoes+"..",temp;
string d2=d1;
bool isex=true;
while(isex) {
isex=false;
for(int i=2; i<=n-1+4; i++) {
temp=d1.substr(i-2,3);
if(temp=="..L"||temp=="L.L") {
d2[i-1]='L';
isex=true;
}
if(temp=="R.."||temp=="R.R") {
d2[i-1]='R';
isex=true;
}
}
//cout<<d2.substr(2,n)<<endl;
d1=d2;
}
return d1.substr(2,n);
}
};
执行用时: 692 ms, 在Push Dominoes的C++提交中击败了0.99% 的用户