📘 題目敘述
給你一個字串 s,它只包含字元 'a' 與 'b'。
如果字串中所有 'a' 都出現在所有 'b' 之前,則回傳 true;否則回傳 false。
條件限制
1 <= s.length <= 100s[i]是'a'或'b'
🧠 解題思路(一)bool判斷
我在想這題時,先把題意換成一句更直覺的話:
字串中不能出現任何一個「先看到 b,後面又出現 a」的情況。
因為只要一旦某個 'a' 出現在 'b' 後面,就代表不是「所有 a 都在 b 前面」,答案直接變成 false。
所以我的做法是從左到右掃描,只記住一件事:我有沒有看過 'b'。
所有變數
s:題目輸入字串check:是否已經遇到過'b'(一旦為true,後面就不允許再出現'a')
🪜 主要流程步驟
- 初始化
check = false,代表目前還沒遇到任何b - 從左到右掃描字串
- 遇到
b:把check設成true - 遇到
a且check == 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/