【leetcode】551&552:Student Attendance Record

551 学生出勤纪录 I

难度:Easy

题目描述

给定一个字符串来代表一个学生的出勤纪录,这个纪录仅包含以下三个字符:

  1. ‘A’ : Absent,缺勤
  2. ‘L’ : Late,迟到
  3. ‘P’ : Present,到场

如果一个学生的出勤纪录中不超过一个’A’(缺勤)并且不超过两个连续的’L’(迟到),那么这个学生会被奖赏。

你需要根据这个学生的出勤纪录判断他是否会被奖赏

示例

1
2
3
4
输入: "PPALLP"
输出: True
输入: "PPALLL"
输出: False

解法一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
bool checkRecord(string s) {
int numA =0, numL = 0;
for (char c : s){
if(c == 'A'){
if (++numA > 1) return false;
numL = 0;
}
else if(c == 'L'){
if (++numL > 2) return false;
}
else{
numL = 0;
}
}
return true;
}
};

知识点:

对字符串的遍历: for(char c:s)

解法二

1
2
3
4
5
6
class Solution {
public:
bool checkRecord(string s) {
return (s.find("A") == string::npos || s.find("A") == s.rfind("A")) && s.find("LLL") == string::npos;
}
};

知识点:

string中的find()函数:若查找成功,返回按查找规则找到的第一个字符或子串的位置;若查找失败,返回string::npos
rfind()find()的差别在于查找顺序不一样,rfind()是从指定位置起向前查找,直到串首。
参见 https://www.cnblogs.com/zpcdbky/p/4471454.html

解法三

1
2
3
4
5
6
class Solution {
public:
bool checkRecord(string s) {
return !regex_search(s, regex("A.*A|LLL"));
}
};

思路:

使用正则匹配,找出不合题意的情况,然后取反即可。正则匹配式是A.*A|LLL.*表示有零个或者多个,那么A.*A就是至少有两A的情况,LLL是三个连续的迟到,|表示两个是或的关系,只要能匹配出任意一种情况,就会返回false

知识点:

regex_search()返回truefalse,搜索字符串中存在符合规则的子字符串 。参考:https://blog.csdn.net/qq_34802416/article/details/79307102

正则表达式中,.*表示零个或多个。


552 学生出勤纪录 II

难度:Hard

挖坑