【滑动窗口】leetcode838.推多米诺

461 篇文章 1 订阅
125 篇文章 2 订阅

题目:
n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。

每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。

如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。

就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。

给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态,其中:

  • dominoes[i] = ‘L’,表示第 i 张多米诺骨牌被推向左侧,
  • dominoes[i] = ‘R’,表示第 i 张多米诺骨牌被推向右侧,
  • dominoes[i] = ‘.’,表示没有推动第 i 张多米诺骨牌。
    返回表示最终状态的字符串。
    在这里插入图片描述
    在这里插入图片描述
    解答:
class Solution:
    def pushDominoes(self, dominoes: str) -> str:
        s = list(dominoes)
        n, i, left = len(s), 0, 'L'
        while i < n:
            #i记录每个.区间的起始位置,left记录紧挨点区间左侧的字符
            #j记录每个.区间的终止位置,right记录紧挨点区间右侧的字符
            j = i
            #拓展窗口,找到一段连续的没有被推动的骨牌(即寻找.区间)
            while j<n and dominoes[j]=='.':
                j+=1
            right=dominoes[j] if j<n else 'R'
            #依据窗口左右两侧的元素,对当前窗口元素进行处理
            #窗口左右两侧元素方向相同,那么这些竖立骨牌也会倒向同一方向
            if left==right:
                while i<j:
                    s[i]=right
                    i+=1
            #窗口左右两侧方向相对,那么就从两侧向中间倒
            elif left=='R' and right=='L':
                k=j-1
                while i<k:
                    s[i]='R'
                    s[k]='L'
                    i+=1
                    k-=1 
            #窗口左右两侧方向相反,无需处理
            #更新窗口左侧的元素,滑动窗口
            left=right
            i=j+1 
        return ''.join(s)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值