持续创造,加速成长!这是我参与「日新计划 10 月更文挑战」的第30天,点击查看活动详情

题目

给你一个字符s 表示一个学生的出勤记载,其间的每个字符用来标记当天的出勤状况(矿工、迟到、参与)。记载中只含下面三种字符:

  • 'A':Absent,矿工
  • 'L':Late,迟到
  • 'P':Present,参与

假如学生可以 同时 满意下面两个条件,则可以获得出勤奖赏:

  • 总出勤 计,学生矿工('A'严厉 少于两天。
  • 学生 不会 存在 接连 3 天或 接连 3 天以上的迟到('L')记载。

假如学生可以获得出勤奖赏,回来 true;不然,回来 false

示例 1:

  • 输入: s = "PPALLP"
  • 输出: true
  • 解说: 学生矿工次数少于 2 次,且不存在 3 天或以上的接连迟到记载。

示例 2:

  • 输入: s = "PPALLL"
  • 输出: false
  • 解说: 学生最终三天接连迟到,所以不满意出勤奖赏的条件。

方法一:一次遍历

思路及解法

可奖赏的出勤记载要求矿工次数少于 2 和接连迟到次数少于 3。判别出勤记载是否可奖赏,只需求遍历出勤记载,判别这两个条件是否同时满意即可。

遍历过程中,记载矿工次数和接连迟到次数,依据遍历到的字符更新矿工次数和接连迟到次数:

  • 假如遇到 ‘A’\text{`A’},即矿工,则将矿工次数加 1,不然矿工次数不变;

  • 假如遇到 ‘L’\text{`L’},即迟到,则将接连迟到次数加 1,不然将接连迟到次数清零。

假如在更新矿工次数和接连迟到次数之后,呈现矿工次数大于或等于 2 或者接连迟到次数大于或等于 3,则该出勤记载不满意可奖赏的要求,回来 false\text{false}。假如遍历结束时未呈现出勤记载不满意可奖赏的要求的状况,则回来 true\text{true}

代码

class Solution {
    func checkRecord(_ s: String) -> Bool {
        var absents: Int = 0
        var lates: Int = 0
        for ch: Character in s {
            if ch == "A" {
                absents += 1
                if absents > 1 {
                    return false
                }
            }
            if ch == "L" {
                lates += 1
                if lates > 2 {
                    return false
                }
            } else {
                lates = 0
            }
        }
        return true
    }
}

复杂度分析

  • 时间复杂度:O(n)O(n),其间 nn 是字符串 ss 的长度。需求遍历字符串 ss 一次。

  • 空间复杂度:O(1)O(1)