给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符:
‘A’ : Absent,缺勤
‘L’ : Late,迟到
‘P’ : Present,到场
如果一个学生的出勤记录中不超过一个’A’(缺勤)并且不超过两个连续的’L’(迟到),那么这个学生会被奖赏。
你需要根据这个学生的出勤记录判断他是否会被奖赏。
示例 1:
输入: “PPALLP”
输出: True
示例 2:
输入: “PPALLL”
输出: False
class Solution {
public boolean checkRecord(String s) {
int A=0;
if(s.length()==2 && s.charAt(0)=='A' &&s.charAt(1)=='A') return false;
//长度为2的情况比如 AA
if(s.charAt(0)=='A') A++;
for(int i=1;i<s.length()-1;i++){
if(s.charAt(i)=='A') A++;
if(s.charAt(i)=='L' && s.charAt(i-1)=='L' && s.charAt(i+1)=='L')
return false;
if(A>1) return false;//for循环里面直接判断
}
return true;
}
}
利用indexOf API判断
class Solution {
public boolean checkRecord(String s) {
int A=0;
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='A') A++;
if(A>1) return false;//for循环里面直接判断
}
return s.indexOf("LLL")<0;
}
}
正则表达式
class Solution {
public boolean checkRecord(String s) {
return !s.matches(".*(A.*A|LLL).*");
}
}
. : 匹配任何除了换行以外的单个字符。
* : 匹配 0 个或者 大于 0 个 * 符号前面的表达式。
.* : 匹配任何字符串
a|b : 要么匹配 a 要么匹配 b
matches 方法被用来检查是否有字符串匹配我们给定的正则表达式。
包含 2 个或更多 AA 的正则表达式为
.*A.*A.*.∗A.∗A.∗ ,
包含子字符串 LLLLLL 对应的正则表达式为
.*LLL.*.∗LLL.∗。我们可以把两个正则表达式
用 |∣ 形成一个正则表达式,来表示或者包含超过 1 个 AA 或者
包含 3 个连续的 LL 的字符串。那么正则表达就变成
.*(A.*A|LLL).*.∗(A.∗A∣LLL).∗。
只有当字符串不能匹配正则表达式的时候我们返回 true。