20250502 LeetCode每日一题——838. 推多米诺
838. 推多米诺
n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。
每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。
如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。
就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。
给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态,其中:
dominoes[i] = 'L',表示第i张多米诺骨牌被推向左侧,dominoes[i] = 'R',表示第i张多米诺骨牌被推向右侧,dominoes[i] = '.',表示没有推动第i张多米诺骨牌。
返回表示最终状态的字符串。
示例 1:
输入:dominoes = "RR.L" 输出:"RR.L" 解释:第一张多米诺骨牌没有给第二张施加额外的力。
示例 2:

输入:dominoes = ".L.R...LR..L.." 输出:"LL.RR.LLRRLL.."
提示:
n == dominoes.length1 <= n <= 10<sup>5</sup>dominoes[i]为'L'、'R'或'.'
题解
个人使用双指针思路,思路没有官方的实现方式巧妙,但也算是笨人有笨方法。刚开始刷LeetCode,代码写的比较丑陋。具体的思路就是,一个指针指向字符串开头,根据该字符和下一个字符的内容,决定结果。两个指针分别是 left和 right,对应的字符就用其代替,初始时 left=0 ,right=1:
-
如果
left=.,那么向右移动right,如果:right=L,那么将left到right中的所有字符都变成L;right=.,那么将right继续向右移动,若right移动到结束,则将所有.维持不变;right=R,将left到right之间的所有符号变成.;- 做完上述操作后,将
left移动到right的位置。
-
如果
left=R,那么向右移动right,如果:right=L,那么将left到right之间的.字符对称分割为R和L;right=.,那么将right继续向右移动,如果right移动到结束,则将所有R更改为.;right=R,将left到right之间的所有符号变成R;- 做完上述操作后,将
left移动到right的位置。
-
如果
left=L,那么直接向右移动left;
经过上述思路的代码实现如下:
1 | # -*- coding: utf-8 -*- |
提交记录
https://leetcode.cn/problems/push-dominoes/submissions/626959701/