1. 程式人生 > >LeetCode:學生的出勤記錄|【551】

LeetCode:學生的出勤記錄|【551】

就是 har 問題 cor 解法 包含 表示 light mat

LeetCode:學生的出勤記錄|【551】

題目描述

給定一個字符串來代表一個學生的出勤紀錄,這個紀錄僅包含以下三個字符:

  1. ‘A‘ : Absent,缺勤
  2. ‘L‘ : Late,遲到
  3. ‘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】