# 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/
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up