力扣 -- 551. 学生出勤记录 I 、 552. 学生出勤记录 II
目录
551. 学生出勤记录
一 、题目描述
二、 实现思路以及代码
552. 学生出勤记录 II
一 、题目描述
二、 实现思路以及代码
551. 学生出勤记录
一 、题目描述
给你一个字符串 s
表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:
'A':Absent,缺勤
'L':Late,迟到
'P':Present,到场
如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:
按 总出勤 计,学生缺勤('A')严格 少于两天。
学生 不会 存在 连续 3 天或 3 天以上的迟到('L')记录。
如果学生可以获得出勤奖励,返回 true
;否则,返回 false
示例 1:
输入:s = "PPALLP"
输出:true
解释:学生缺勤次数少于 2 次,且不存在 3 天或以上的连续迟到记录。
示例 2:
输入:s = "PPALLL"
输出:false
解释:学生最后三天连续迟到,所以不满足出勤奖励的条件。
二、 实现思路以及代码
class Solution {public boolean checkRecord(String s) {int len = s.length();if(len < 2){return true;}int aNum = 0;//记录缺勤天数int lNum = 0;//记录连续迟到天数for(int i = 0; i < len; i++){/**遍历字符串,记录缺勤天数以及连续迟到天数*/char c = s.charAt(i);if(c == 'A'){//缺勤天数大于等于2,则直接返回falseaNum++;if(aNum>=2){return false;}}else if(c == 'L'){//遇到第一个迟到lNum++;for(int j = i+1; j < len; j++){//往后if(s.charAt(j) == 'L' ){lNum++;if(lNum == 3){//遇到三次迟到,直接返回falsereturn false;}}else{lNum = 0;}}}else {continue;}}return true;}
}
552. 学生出勤记录 II
一 、题目描述
给你一个字符串 s
表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:
'A':Absent,缺勤
'L':Late,迟到
'P':Present,到场
如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:
按 总出勤 计,学生缺勤('A')严格 少于两天。
学生 不会 存在 连续 3 天或 连续 3 天以上的迟到('L')记录。
给你一个整数 n ,表示出勤记录的长度(次数)。请你返回记录长度为 n 时,可能获得出勤奖励的记录情况 数量 。答案可能很大,所以返回对 109 + 7 取余 的结果。
示例 1:
输入:n = 2
输出:8
解释:
有 8 种长度为 2 的记录将被视为可奖励:
"PP" , "AP", "PA", "LP", "PL", "AL", "LA", "LL"
只有"AA"不会被视为可奖励,因为缺勤次数为 2 次(需要少于 2 次)。
示例 2:
输入:n = 1
输出:3
示例 3:
输入:n = 10101
输出:183236316
提示:
1 <= n <= 105
二、 实现思路以及代码
/*** 'A':Absent,缺勤* 'L':Late,迟到* 'P':Present,到场* 如果记录不包含多于一个’A’(缺勤)或超过两个连续的’L’(迟到),则该记录被视为可奖励的。* 思路:* (1)定义三个数组。P[N+2],L[N+2],A[N+2]。P【i】表示第i位是'P'时的所有符合可以奖励的字符串组合数,即数组【0.。i】内以P为末尾的字符串数,L【i】和A【i】也是如此* (2)初始化 ; A[0] = 1; P[0] = 1; L[0] = 1; A[1] = 2; P[1] = 3; L[1] = 3; A[2] = 4;* (3)判别P[i]、L【i】和A【i】的地推关系式* (3.1) P字符没有对奖励没什么影响,P可以跟在任意三个字符后面,故P[i]只和前面的(i-1)个字符的排列组合有关,P[i] = A[i-1] + L[i - 1] + P[i - 1]* (3.2) L字符不能有连续的三个L,否则无法获得奖励。最后一个字符是L的话,则前面的 i-1 个字符 和 i-2 个不能全部是L。* i-1 位可以是A或者P,这种情况下L[i] = A[i-1]+P[i-1]* i-1 位可以是L,则 i-2 位必须是P 或者 A。则L[i] = P[i-2]+A[i-2];* 综上,以L为结尾字符的排列个数是L[i] = A[i-1]+P[i-1]+P[i-2]+A[i-2];* (3.3) A 字符不超过2个既可获得奖励。最后一位是A时,则前面不能有A。如何保证前面没有A,* 只有P或者L。则需定义两个新的数组onP[i],onL[i]分别表示以P或L结尾,且前面没有A的排列组合。* 可知 :A[i] = onP[i-1]+onL[i-1];* 由3.1、3.2 知onP = onP[i-1] + onL[i-1] onL = onP[i-1]+onP[i-2]* 由上面三个式子可推出:A[i] = A[i-1] + A[i-2] + A[i-3]* (4)返回 P[n-1] + L[n-1] + A[n-1]的值*
class Solution {public int checkRecord(int n) {final int MOD = 1000000007;//创建数组 int[] A = new int[n+2];int[] L = new int[n+2];int[] P = new int[n+2];// 初始化A[0] = 1;P[0] = 1;L[0] = 1;A[1] = 2;P[1] = 3;L[1] = 3;A[2] = 4;for (int i = 2; i < n; i++) {P[i] = ((P[i - 1] + L[i - 1]) % MOD + A[i - 1]) % MOD;L[i] = ((P[i - 1] + A[i - 1]) % MOD + (P[i - 2] + A[i - 2]) % MOD) % MOD;if (i > 2) {A[i] = ((A[i - 1] + A[i - 2]) % MOD + A[i - 3]) % MOD;}}return ((P[n - 1] + A[n - 1]) % MOD + L[n - 1]) % MOD;}
}
力扣 -- 551. 学生出勤记录 I 、 552. 学生出勤记录 II相关推荐
- python【力扣LeetCode算法题库】219 -存在重复元素 II
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. 示例 1: 输入: nums = ...
- 力扣编程题-解法汇总
一.力扣链接: 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 备注:以后每个工作日从前往后刷一道题,然后再加一道每日新题.每天两道题. 二.模版: 标题: 力扣解法汇总5-正则表达 ...
- 力扣第314场周赛补题
1.题目:6200. 处理用时最长的那个任务的员工 - 力扣(LeetCode) 思路:两个数组记录处理时间与结果,通过遍历最长时间 class Solution { public:int harde ...
- LeetCode——552. 学生出勤记录 II(Student Attendance Record II)[困难]——分析及代码(Java)
LeetCode--552. 学生出勤记录 II[Student Attendance Record II][困难]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 ( ...
- leetcode: 552. 学生出勤记录 II
552. 学生出勤记录 II 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/student-attendance-record-ii/ 可以用字符串 ...
- 【Leetcode】552. 学生出勤记录 II
552. 学生出勤记录 II 题目描述 解题思路 题目描述 可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤.迟到.到场).记录中只含下面三种字符: 'A':Absent ...
- LeetCode 552. 学生出勤记录 II(动态规划)
文章目录 1. 题目 2. 解题 1. 题目 给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量. 答案可能非常大,你只需返回结果mod 10^9 + 7的值. 学生出勤记录是只 ...
- 552. 学生出勤记录 II
552. 学生出勤记录 II 可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤.迟到.到场).记录中只含下面三种字符: 'A':Absent,缺勤 'L':Late,迟到 ...
- Leetcode 552.学生出勤记录‖ 动态规划+容斥
题目链接:传送门 可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤.迟到.到场).记录中只含下面三种字符: 'A':Absent,缺勤 'L':Late,迟到 'P':P ...
最新文章
- Nginx10m+高并发内核优化详解
- python小白逆袭大神课程心得_Python小白逆袭大神学习心得
- MyBatis构建sql时动态传入表名以及字段名
- 下载的VS2017工程编译出错的问题
- 06-CA/TA编程:rsa demo
- 郑州军办计算机学校,郑州市国防科技学校2019级新生开启军训模式
- 前端:实现div等块元素添加X轴滚动显示(Y轴不滚动)
- 【新功能】媒体处理MPS全新支持自适应多码率、多语言音轨
- java 连接oracle 进行增删改查
- CSS3学习笔记-技术提示
- SAP License:选择ERP系统的诀窍
- Linux安装redis及redis的php扩展。
- 易筋SpringBoot 2.1 | 第十九篇:SpringBoot的常用注解
- c语言通过信号量id获取值_Linux信号量
- msvcr71.dll等dll丢失的解决方法
- 【Flutter实战静态页面】--在线点餐app(8)——详情框架1
- 宝塔面板建立的网站为什么访问不了
- 九峰影业创始人_以终为始 逐梦青春——九峰实验学校2020届高三毕业典礼
- diskman 恢复分区表找到数据
- 达内学习的java类库01
热门文章
- Allegro 16.6 给动态铜皮指定网络的时候***Net VCC was selected. Resuming current application。
- 最长不重复子串python,Python编程题16--最长不重复子串
- 浙大愤青教授郑强经典语录
- python判断火车票座位_火车票买不到?看我用python监控票源
- Redis入门(3): 数据新类型(BitmapsHyperLogLog,GeoSpatial),Jredis,springboot与redis的整合
- 树莓派远程4G遥控车教程(三)-摄像头安装及实现局域网实时监控
- IMX6Q基于yocto 4.9.88系统交叉编译nss-3.73
- 神州信息出席2021中关村金融科技节并做主题演讲
- mongodb near java_简阅MongoDB JVM开发库
- jeecg 从一个Tab页跳转到另一个Tab页