学生出勤记录 I

标签: 字符串

难度: Easy

给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:

  • 'A':Absent,缺勤
  • 'L':Late,迟到
  • 'P':Present,到场

如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:

  • 总出勤 计,学生缺勤('A'严格 少于两天。
  • 学生 不会 存在 连续 3 天或 连续 3 天以上的迟到('L')记录。

如果学生可以获得出勤奖励,返回 true ;否则,返回 false

示例 1:

输入:s = "PPALLP"
输出:true
解释:学生缺勤次数少于 2 次,且不存在 3 天或以上的连续迟到记录。

示例 2:

输入:s = "PPALLL"
输出:false
解释:学生最后三天连续迟到,所以不满足出勤奖励的条件。

提示:

  • 1 <= s.length <= 1000
  • s[i]'A''L''P'

Submission

运行时间: 18 ms

内存: 16.0 MB

class Solution:
    def checkRecord(self, s: str) -> bool:
        a = 0
        l = 0

        for i in range(len(s)):
            if s[i] == "A":
                a += 1
                if a > 1:
                    return False
            elif s[i] == "L":
                l += 1
                if l > 2:
                    return False
                
                if i < len(s) - 1 and s[i+1] != "L":
                    l = 0
        return True

Explain

此题解通过单次遍历字符串s来检查出勤记录是否符合奖励条件。它使用两个变量a和l来分别跟踪缺勤和连续迟到的天数。遍历过程中,若遇到'A'字符,则a增加1,如果a超过1,则立即返回False表示不符合条件。对于'L'字符,l增加1,如果l超过2,则也返回False。此外,如果当前字符为'L'但下一个字符不是'L',则将l重置为0。如果整个字符串遍历完毕没有返回False,则表示学生符合获得奖励的条件,返回True。

时间复杂度: O(n)

空间复杂度: O(1)

# 定义Solution类

class Solution:
    def checkRecord(self, s: str) -> bool:
        a = 0  # 缺勤计数器
        l = 0  # 连续迟到计数器

        for i in range(len(s)):
            if s[i] == 'A':
                a += 1  # 缺勤次数增加
                if a > 1:
                    return False  # 缺勤超过一次,直接返回False
            elif s[i] == 'L':
                l += 1  # 连续迟到次数增加
                if l > 2:
                    return False  # 连续迟到超过两次,直接返回False
                # 检查下一个字符,若不是'L',则重置连续迟到计数器
                if i < len(s) - 1 and s[i+1] != 'L':
                    l = 0
        return True  # 如果检查完所有字符都没有问题,返回True

Explore

在遍历字符串时,每次遇到'L'字符,会先增加连续迟到计数器l的值。然后,我会检查当前位置是否小于字符串长度减1(即不是最后一个字符),如果是这种情况,我接着查看下一个字符是否也是'L'。如果下一个字符不是'L',说明连续迟到的情况已经结束,因此需要重置l为0。这样可以确保l只计数连续的'L'字符序列。

根据题目的规则,如果学生的缺勤次数超过1次,则不符合获得奖励的条件。因此,一旦缺勤计数器a的值超过1,无论字符串中后面的字符如何,学生已经不符合条件了。为了提高算法效率,一旦确定无法满足条件,立即返回False,避免不必要的进一步检查。

是的,我的算法中考虑到了这一点。在代码中,每次增加连续迟到计数器l之前,都会检查当前字符是否是字符串的最后一个字符。这是通过判断当前索引i是否小于字符串长度减1来实现的。如果i等于字符串长度减1(即当前字符是最后一个字符),则不会进行下一个字符的检查,也不会错误地访问超出字符串长度的索引。

算法确实考虑了字符串s为空的情况。如果字符串为空,说明没有任何出勤记录,因此没有缺勤或连续迟到的情况发生。根据题目的定义,学生在没有任何违规记录的情况下默认符合获得奖励的条件。因此,如果输入字符串s为空,算法应该返回True。