news 2026/6/5 8:25:31

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 - 1i之间(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/6/5 6:08:05

java计算机毕业设计社区志愿者服务系统 智慧社区公益志愿协同平台 基层志愿者数字化运营管理系统

计算机毕业设计社区志愿者服务系统38q2o9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“志愿红”成为社区里最温暖的底色&#xff0c;传统的人工登记、微信群接龙、纸质工时…

作者头像 李华
网站建设 2026/5/30 13:12:59

考核算法题纠错

考核题算法题纠错 打家劫舍int rob(int* nums, int numsSize) {if (numsSize 0) return 0;if (numsSize 1) return nums[0];int prev_prev nums[0];int prev nums[0] > nums[1] ? nums[0] : nums[1];for (int i 2; i < numsSize; i) {int current prev > (prev…

作者头像 李华
网站建设 2026/6/4 14:40:12

天天劈砖休闲小游戏Linux演示教程

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ 本站教程、资源皆在单机环境进行&#xff0c;仅供单机研究学习使用。 ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ 一、获取材料和结果演示 百度网盘链接: https://…

作者头像 李华
网站建设 2026/6/3 2:31:15

普中开发板基于51单片机贪吃蛇游戏设计

基于51单片机贪吃蛇游戏设计( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus8.17(有低版本) 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;P24 1主要功能&#xff1a; 基于51单片机的贪吃蛇游戏设计 1、采用8*8点…

作者头像 李华
网站建设 2026/6/1 1:12:01

《从零入门 Ascend C:手把手实现高性能向量加法自定义算子》

1. 引言&#xff1a;为什么需要 Ascend C&#xff1f;在深度学习模型训练与推理中&#xff0c;标准算子库&#xff08;如 cuDNN、ACL&#xff09;虽已高度优化&#xff0c;但面对新型网络结构、特殊数据格式或极致性能需求时&#xff0c;往往力不从心。此时&#xff0c;开发者需…

作者头像 李华
网站建设 2026/5/30 1:40:18

DroidCam零基础入门:5分钟把手机变电脑摄像头

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个交互式新手引导应用&#xff0c;通过动画演示和简单步骤&#xff1a;1) 如何在手机和电脑上安装DroidCam&#xff1b;2) 基础连接设置图解&#xff1b;3) 常见应用场景展示…

作者头像 李华