代码拉取完成,页面将自动刷新
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'; 以及 '.';
首先最终的 dominoes 状态一定满足:
因此我们只需要探究字符串 dominoes 中的 "." 在最终是 L 还是 R 即可。这里有一个关键点:只有相邻的受力 dominoes 才会相互影响。比如 .L...R..L 那么:
想清楚这些,我们的算法就比较简单了。
我们可以使用双指针。其中:
左指针和右指针之前的 domino(一定是 .),最终的状态由左右指针指向而定。
具体地:
为了简化判断,可以在 domino 前放一个 L,后放一个 R。
Python3 Code:
class Solution:
def pushDominoes(self, dominoes: str) -> str:
dominoes = 'L' + dominoes + 'R'
i = 0
j = i + 1
ans = ''
while j < len(dominoes):
if dominoes[j] == '.':
j += 1
continue
count = (j - i - 1)
if i != 0 :ans += dominoes[i]
if dominoes[i] == 'L' and dominoes[j] == 'R':
ans += '.' * count
elif dominoes[i] == 'L' and dominoes[j] == 'L':
ans += 'L' * count
elif dominoes[i] == 'R' and dominoes[j] == 'R':
ans += 'R' * count
elif dominoes[i] == 'R' and dominoes[j] == 'L':
ans += 'R' * (count//2) + '.'*(count%2) + 'L' * (count//2)
i = j
j += 1
return ans
复杂度分析
令 n 为数组长度。
此题解由 力扣刷题插件 自动生成。
力扣的小伙伴可以关注我,这样就会第一时间收到我的动态啦~
以上就是本文的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 40K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。