---
# System prepended metadata

title: 2124. Check if All A's Appears Before All B's
tags: [Leetcode]

---

# 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'`。**

我用一個布林值 `check` 表示：

* `check = false`：到目前為止還沒遇到 `'b'`
* `check = true`：到目前為止已經遇到至少一個 `'b'`

接著掃描每個字元：

* 如果遇到 `'b'`：把 `check` 變成 `true`（代表後面開始不應該再看到 `'a'`）
* 如果遇到 `'a'`：

  * 若 `check` 仍是 `false`，代表還在 `a` 的區域，沒問題
  * 若 `check` 已經是 `true`，代表我已經進入過 `b` 的區域，又跑出 `a`，立刻回傳 `false`

如果整串掃完都沒有出現這種違規情況，就回傳 `true`。

### 所有變數

* `s`：題目輸入字串
* `check`：是否已經遇到過 `'b'`（一旦為 `true`，後面就不允許再出現 `'a'`）

## 🪜 主要流程步驟

* 初始化 `check = false`，代表目前還沒遇到任何 `b`
* 從左到右掃描字串

  * 遇到 `b`：把 `check` 設成 `true`
  * 遇到 `a` 且 `check == true`：代表 `a` 出現在 `b` 後面，直接回傳 `false`
* 掃描結束仍沒違規，回傳 `true`

## 💻 程式碼實作（一）

```cpp
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`

## 💻 程式碼實作（二）

```cpp
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/description/
