2124. Check if All A's Appears Before All B's

練習日期:2026-02-07

難度:Easy

類型:String

📘 題目敘述

給你一個字串 s,它只包含字元 'a''b'

如果字串中所有 'a' 都出現在所有 'b' 之前,則回傳 true;否則回傳 false

條件限制

  • 1 <= s.length <= 100
  • s[i]'a''b'

🧠 解題思路(一)bool判斷

我在想這題時,先把題意換成一句更直覺的話:

字串中不能出現任何一個「先看到 b,後面又出現 a」的情況。

因為只要一旦某個 'a' 出現在 'b' 後面,就代表不是「所有 a 都在 b 前面」,答案直接變成 false

所以我的做法是從左到右掃描,只記住一件事:我有沒有看過 'b'

所有變數

  • s:題目輸入字串
  • check:是否已經遇到過 'b'(一旦為 true,後面就不允許再出現 'a'

🪜 主要流程步驟

  • 初始化 check = false,代表目前還沒遇到任何 b
  • 從左到右掃描字串
    • 遇到 b:把 check 設成 true
    • 遇到 acheck == true:代表 a 出現在 b 後面,直接回傳 false
  • 掃描結束仍沒違規,回傳 true

💻 程式碼實作(一)

class Solution {
public:
    bool checkString(string s) {
        bool check = false;
        for (char a : s) {
            if (a == 'b') {
                check = true;
            } else if (check) {
                return false;
            }
        }
        return true;
    }
};

🧠 解題思路(二)直接find

學了find之後,我把題意換成一個「更好檢查」的條件:

如果所有 a 都在所有 b 之前,那字串裡就不可能出現子字串 "ba"

因為只要出現 "ba",就代表有一個 b 在前、後面緊接著(或至少在後面)出現了 a,這就違反了「所有 a 都要在 b 前面」的規定。

反過來,如果整個字串裡完全找不到 "ba",那就表示:

  • 一旦開始出現 b,後面就不會再出現 a
  • 所以所有 a 一定都在所有 b 之前

因此這題可以直接用 string::find

  • s.find("ba") == string::npos 代表找不到 "ba" → 回傳 true
  • 否則回傳 false

所有變數

  • s:題目輸入字串

🪜 主要流程步驟

  • s.find("ba") 檢查字串中是否存在子字串 "ba"
  • 如果回傳值是 string::npos(找不到)
    • 代表沒有違規情況 → 回傳 true
  • 否則
    • 代表出現過 "ba" → 回傳 false

💻 程式碼實作(二)

class Solution {
public:
    bool checkString(string s) {
        return ((s.find("ba") == string::npos) ? true : false);
    }
};

https://leetcode.com/problems/check-if-all-as-appears-before-all-bs/

作者: scottnick
撰寫日期: 2026-02-07
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/2124-check-if-all-as-appears-before-all-bs.html