跳至主要內容

551. 学生出勤记录 I


551. 学生出勤记录 I

🟢   🔖  字符串  🔗 力扣open in new window LeetCodeopen in new window

题目

You are given a string s representing an attendance record for a student where each character signifies whether the student was absent, late, or present on that day. The record only contains the following three characters:

  • 'A': Absent.
  • 'L': Late.
  • 'P': Present.

The student is eligible for an attendance award if they meet both of the following criteria:

  • The student was absent ('A') for strictly fewer than 2 days total.
  • The student was never late ('L') for 3 or more consecutive days.

Return true if the student is eligible for an attendance award, orfalseotherwise.

Example 1:

Input: s = "PPALLP"

Output: true

Explanation: The student has fewer than 2 absences and was never late 3 or more consecutive days.

Example 2:

Input: s = "PPALLL"

Output: false

Explanation: The student was late 3 consecutive days in the last 3 days, so is not eligible for the award.

Constraints:

  • 1 <= s.length <= 1000
  • s[i] is either 'A', 'L', or 'P'.

题目大意

给你一个字符串 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'

解题思路

  1. 条件 1:缺勤次数严格少于 2 次

    • 遍历字符串统计字符 'A' 的个数。
    • 如果缺勤次数大于等于 2 次,直接返回 false
  2. 条件 2:不存在连续 3 次或以上的迟到

    • 使用字符串方法 s.includes('LLL') 判断是否存在连续 3 个 'L' 的子串。
    • 如果存在,返回 false
  3. 如果两项检查均通过,返回 true

复杂度分析

  • 时间复杂度O(n),其中 n 是字符串长度。
    • 遍历统计缺勤次数,时间复杂度为 O(n)
    • 使用 s.includes('LLL')检查连续迟到,时间复杂度为 O(n)
    • 总时间复杂度 O(n) + O(n) = O(n)
  • 空间复杂度O(1),没有额外的数据结构使用。

代码

/**
 * @param {string} s
 * @return {boolean}
 */
var checkRecord = function (s) {
	// 检查缺勤次数是否少于 2 次
	let absentCount = 0;
	for (let char of s) {
		if (char === 'A') {
			absentCount++;
			if (absentCount >= 2) return false; // 提前终止
		}
	}
	// 检查是否存在连续 3 次迟到
	if (s.includes('LLL')) return false;

	return true;
};

相关题目

题号标题题解标签难度力扣
552学生出勤记录 II动态规划🔴🀄️open in new window 🔗open in new window