【Leetcode】2147. 分隔长廊的方案数——1915

题目

在一个图书馆的长廊里,有一些座位和装饰植物排成一列。给你一个下标从 0 开始,长度为 n 的字符串 corridor ,它包含字母 'S''P' ,其中每个 'S' 表示一个座位,每个 'P' 表示一株植物。

在下标 0 的左边和下标 n - 1 的右边 已经 分别各放了一个屏风。你还需要额外放置一些屏风。每一个位置 i - 1i 之间(1 <= i <= n - 1),至多能放一个屏风。

请你将走廊用屏风划分为若干段,且每一段内都 恰好有两个座位 ,而每一段内植物的数目没有要求。可能有多种划分方案,如果两个方案中有任何一个屏风的位置不同,那么它们被视为 不同 方案。

请你返回划分走廊的方案数。由于答案可能很大,请你返回它对 \(10^9 + 7\) 取余 的结果。如果没有任何方案,请返回 0

  • \(1\leq corridor.length\leq 10^5\)
  • corridor[i] 要么是 'S' ,要么是 'P'

思路

既然要求每一组恰好两个座位,那么其实每一组的两个座位都是固定的,可以划分的很多方案的关键就在于两个组之间由于植物的存在产生的空隙可以任意插入。

我们设置一个标志f用以标记当前组是否找到了两个,如果找到了两个之后再次找到了一个,那么此时结果就乘以上一个找到的座位与当前位置的间距。

最后需要单独的判断一下最后一组是否是找到了两个座位。

此外,需要额外注意的是,如果一组也不能放置,即所有的位置都是植物,此时也是算作无效的,因为题目说明开始和结束位置默认有屏风,不插入任何的屏风也算作一组,即不满足每个组都是两个座位的条件。因此,当所有位置都是植物的时候,直接返回0

class Solution:
    def numberOfWays(self, corridor: str) -> int:
        f = True  # 标记是否找到了一组
        ans = 1
        last = -1
        while last+1 < len(corridor) and corridor[last+1] == "P":last+=1
        if last == len(corridor)-1:return 0
        MOD = 10 ** 9 + 7
        for i, x in enumerate(corridor):
            if x == "S":
                if f:
                    ans = (ans * (i - last)) % MOD
                f = not f
                last = i
        return ans if f else 0
posted @ 2024-09-19 20:41  TICSMC  阅读(13)  评论(0)    收藏  举报