LeetCode:學生的出勤記錄|【551】
阿新 • • 發佈:2018-10-17
就是 har 問題 cor 解法 包含 表示 light mat
LeetCode:學生的出勤記錄|【551】
題目描述
給定一個字符串來代表一個學生的出勤紀錄,這個紀錄僅包含以下三個字符:
- ‘A‘ : Absent,缺勤
- ‘L‘ : Late,遲到
- ‘P‘ : Present,到場
如果一個學生的出勤紀錄中不超過一個‘A‘(缺勤)並且不超過兩個連續的‘L‘(遲到),那麽這個學生會被獎賞。
你需要根據這個學生的出勤紀錄判斷他是否會被獎賞。
示例 1:
輸入: "PPALLP" 輸出: True
示例 2:
輸入: "PPALLL" 輸出: False
題目分析
對於字符串問題,我們需要反思,所謂的頑石——正則表達式。
很多問題明明可以快速得到解決,就是因為我們的下的苦太少了,所以事與願違。
L{3,}可以表示連續3個及以上L出現,A.*A可以表示出現2次A的情況,這樣如果正則匹配成功,那麽就說明不會被獎賞!
Java題解
class Solution { public boolean checkRecord(String s) { if(s.matches(".*L{3,}.*")) return false; if(s.matches(".*A.*A.*")) return false; return true; } }
但是上面的對於這道題來說 正則表達式解法簡潔卻不高效。
我們循環一次字符串,一個變量統計A的次數,一個變量統計連續L的次數,連續次數有一個技巧,遇到第一個L的時候開始計數,下一個不是L的話,立刻清空計數變量。
public boolean checkRecord(String s) { int a = 0; int l = 0; for(char c :s.toCharArray()) { if(c==‘A‘) a++; if(c==‘L‘) l++; else l=0; if(a>1||l>=3) return false; } return true; }
LeetCode:學生的出勤記錄|【551】