目录

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相关推荐

  1. python【力扣LeetCode算法题库】219 -存在重复元素 II

    给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. 示例 1: 输入: nums = ...

  2. 力扣编程题-解法汇总

    一.力扣链接: 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 备注:以后每个工作日从前往后刷一道题,然后再加一道每日新题.每天两道题. 二.模版: 标题: 力扣解法汇总5-正则表达 ...

  3. 力扣第314场周赛补题

    1.题目:6200. 处理用时最长的那个任务的员工 - 力扣(LeetCode) 思路:两个数组记录处理时间与结果,通过遍历最长时间 class Solution { public:int harde ...

  4. LeetCode——552. 学生出勤记录 II(Student Attendance Record II)[困难]——分析及代码(Java)

    LeetCode--552. 学生出勤记录 II[Student Attendance Record II][困难]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 ( ...

  5. leetcode: 552. 学生出勤记录 II

    552. 学生出勤记录 II 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/student-attendance-record-ii/ 可以用字符串 ...

  6. 【Leetcode】552. 学生出勤记录 II

    552. 学生出勤记录 II 题目描述 解题思路 题目描述 可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤.迟到.到场).记录中只含下面三种字符: 'A':Absent ...

  7. LeetCode 552. 学生出勤记录 II(动态规划)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量. 答案可能非常大,你只需返回结果mod 10^9 + 7的值. 学生出勤记录是只 ...

  8. 552. 学生出勤记录 II

    552. 学生出勤记录 II 可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤.迟到.到场).记录中只含下面三种字符: 'A':Absent,缺勤 'L':Late,迟到 ...

  9. Leetcode 552.学生出勤记录‖ 动态规划+容斥

    题目链接:传送门 可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤.迟到.到场).记录中只含下面三种字符: 'A':Absent,缺勤 'L':Late,迟到 'P':P ...

最新文章

  1. Nginx10m+高并发内核优化详解
  2. python小白逆袭大神课程心得_Python小白逆袭大神学习心得
  3. MyBatis构建sql时动态传入表名以及字段名
  4. 下载的VS2017工程编译出错的问题
  5. 06-CA/TA编程:rsa demo
  6. 郑州军办计算机学校,郑州市国防科技学校2019级新生开启军训模式
  7. 前端:实现div等块元素添加X轴滚动显示(Y轴不滚动)
  8. 【新功能】媒体处理MPS全新支持自适应多码率、多语言音轨
  9. java 连接oracle 进行增删改查
  10. CSS3学习笔记-技术提示
  11. SAP License:选择ERP系统的诀窍
  12. Linux安装redis及redis的php扩展。
  13. 易筋SpringBoot 2.1 | 第十九篇:SpringBoot的常用注解
  14. c语言通过信号量id获取值_Linux信号量
  15. msvcr71.dll等dll丢失的解决方法
  16. 【Flutter实战静态页面】--在线点餐app(8)——详情框架1
  17. 宝塔面板建立的网站为什么访问不了
  18. 九峰影业创始人_以终为始 逐梦青春——九峰实验学校2020届高三毕业典礼
  19. diskman 恢复分区表找到数据
  20. 达内学习的java类库01

热门文章

  1. Allegro 16.6 给动态铜皮指定网络的时候***Net VCC was selected. Resuming current application。
  2. 最长不重复子串python,Python编程题16--最长不重复子串
  3. 浙大愤青教授郑强经典语录
  4. python判断火车票座位_火车票买不到?看我用python监控票源
  5. Redis入门(3): 数据新类型(BitmapsHyperLogLog,GeoSpatial),Jredis,springboot与redis的整合
  6. 树莓派远程4G遥控车教程(三)-摄像头安装及实现局域网实时监控
  7. IMX6Q基于yocto 4.9.88系统交叉编译nss-3.73
  8. 神州信息出席2021中关村金融科技节并做主题演讲
  9. mongodb near java_简阅MongoDB JVM开发库
  10. jeecg 从一个Tab页跳转到另一个Tab页