Leetcode 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’; 以及 ‘.’;
题解
0 1 2 3 4 5 6 7 8 9 10 11 12 13
. L . R . . . L R . . L . .
1 1 7 7 7 7 11 11 11 //从右向左记录L,只有遇到L才开始记录
3 3 3 3 8 8 8 //从左向右记录R,只有遇到R才开始记录
L L . R R .
因此,坐标i,距离最近的L的距离为L(i)-i,距离最近的R的距离为i-R(i)
故L(i)-i>i-R(i) 其为L
L(i)-i<i-R(i)其为R
L(i)-i=i-R(i)其为.
详细过程见代码
代码
string pushDominoes(string dominoes) {
int len = dominoes.length();
vector<int> L(len,-1);
vector<int> R(len,-1);
bool flag = false;
int place;
for(int i=len-1; i>=0; i--){
if(dominoes[i] == 'L'){
flag = true;
place = i;
}else if(dominoes[i] == 'R'){
flag = false;
}
if(flag) L[i] = place;
}
flag = false;
for(int i=0; i<len; i++){
if(dominoes[i] == 'R'){
flag = true;
place = i;
}else if(dominoes[i] == 'L'){
flag = false;
}
if(flag) R[i] = place;
}
string ans;
for(int i=0; i<len; i++){
if(L[i]==-1 && R[i]==-1) ans += ".";
else if(L[i] == -1) ans += "R";
else if(R[i] == -1) ans += "L";
else{
if(L[i]-i < i-R[i]) ans += "L";
else if(L[i]-i > i-R[i]) ans += "R";
else ans += ".";
}
}
return ans;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/push-dominoes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。