news 2026/10/25 10:59:10

LeetCode 2147.分隔长廊的方案数:非Hard组合数学

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 2147.分隔长廊的方案数:非Hard组合数学

【LetMeFly】2147.分隔长廊的方案数:非Hard组合数学

力扣题目链接:https://leetcode.cn/problems/number-of-ways-to-divide-a-long-corridor/

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

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

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

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

示例 1:

输入:corridor = "SSPPSPS"输出:3解释:总共有 3 种不同分隔走廊的方案。 上图中黑色的竖线表示已经放置好的屏风。 上图每种方案中,每一段都恰好有两个座位。

示例 2:

输入:corridor = "PPSPSP"输出:1解释:只有 1 种分隔走廊的方案,就是不放置任何屏风。 放置任何的屏风都会导致有一段无法恰好有 2 个座位。

示例 3:

输入:corridor = "S"输出:0解释:没有任何方案,因为总是有一段无法恰好有 2 个座位。

提示:

  • n == corridor.length
  • 1 <= n <= 105
  • corridor[i]要么是'S',要么是'P'。

解题方法:遍历

从左往右遍历,每出现总计两个座位就要进行一次分隔,本次分隔方案数为两个座位中后一个座位与下一个座位之间的绿植数加一。(若后续再无座位,则不需要放置隔板)

总方案数就是每次放置隔板时的方案数之积。

额外注意,本题给定的答案中,若没有座位,则输出0而非“一个隔板都不放的这唯一一种方案”1。

具体做法

使用一个变量ing记录当前是否处在两个座位之后下一个座位之前的数绿植状态,使用一个变量now记录当前总计座位数或绿植数,遍历时候使用几个if-else就好了。

额外注意,可以使用一个变量atLeast2记录是否至少有两个座位,遍历过程中一旦出现累计两个座位则将该值赋值为true。

最终若不是在数绿植状态(不是刚好两个座位后)或一共也没有两个座位,返回0。

时空复杂度分析

  • 时间复杂度O ( l e n ( c o r r i d o r ) ) O(len(corridor))O(len(corridor))
  • 空间复杂度O ( 1 ) O(1)O(1)

AC代码

C++
/* * @LastEditTime: 2025-12-14 17:37:56 */typedeflonglongll;constll MOD=1e9+7;classSolution{public:intnumberOfWays(string&corridor){ll ans=1;intnow=0;booling=false;// 正在处理两块座位之间的绿植boolatLeast2=false;for(charc:corridor){if(c=='S'){if(ing){ans=ans*(now+1)%MOD;ing=false;now=1;}else{now++;if(now==2){ing=true;now=0;atLeast2=true;}}}else{// 'P'if(ing){now++;}}}if(!ing||!atLeast2){return0;}returnstatic_cast<int>(ans);}};
  • 执行用时分布8ms击败96.53%
  • 消耗内存分布26.95MB击败100.00%

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/24 21:38:06

保姆级教程:iPhone 某人短信消失?9 种解决方法,小白也会用

当某个联系人的短信突然从你的 iPhone 上消失时&#xff0c;你会感到很沮丧。你知道你没有删除它们&#xff0c;但整个对话却神秘地消失了。你并不孤单。许多 iPhone 用户在论坛上都报告了这个问题。无论是 iOS 故障、同步问题还是意外删除&#xff0c;本文都会从各个角度进行分…

作者头像 李华
网站建设 2026/10/25 3:20:02

31、进程间通信:信号、管道与套接字详解

进程间通信:信号、管道与套接字详解 1. 信号设置与处理 信号是进程间通信的重要方式之一,在处理信号时,我们可以设置不同的信号行为。以下是信号行为设置的相关模式: | 操作 | System V 模式 | POSIX 模式 | | — | — | — | | 忽略信号 | sigaction(signo,new,old) …

作者头像 李华
网站建设 2026/10/25 4:46:28

C语言归并排序

归并排序 归并排序——最常见的分治排序算法&#xff1b;把两个已经有序的数组合并成一个有序数组 一、归并排序思路 分&#xff1a;递归地把当前区间 [left, right] 一分为二&#xff0c;直到区间长度 ≤1。治&#xff1a;把两个已经有序的子区间合并成一个有序区间。合并时需…

作者头像 李华
网站建设 2026/10/25 12:12:43

java计算机毕业设计社区疫情防控管理系统 街区居民防疫信息综合平台 基层社区疫情联防联控小程序

计算机毕业设计社区疫情防控管理系统orcuw9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。疫情反复期间&#xff0c;社区卡口纸质登记、微信群接龙、人工电话追核酸造成数据碎片…

作者头像 李华
网站建设 2026/10/26 6:22:09

vue基于Spring Boot框架的 蛋糕购物商城的设计_k495g9n8

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华