📘 題目敘述
我們定義一個單字使用大寫(capitals)的方式是正確的,當且僅當符合以下其中一種情況:
- 這個單字的所有字母都是大寫,例如
"USA" - 這個單字的所有字母都不是大寫(也就是全小寫),例如
"leetcode" - 只有第一個字母是大寫,其餘字母都是小寫,例如
"Google"
給你一個字串 word,如果它使用大寫的方式正確就回傳 true,否則回傳 false。
條件限制
1 <= word.length <= 100word只由英文大小寫字母組成
🧠 解題思路
我用一次掃描,同時維護兩個「目前還有可能成立的規則」:
-
low:目前看起來是否還可能是「只有第一個字母大寫,其餘小寫」- 一旦我在第 2 個字母之後看到大寫,就不可能是這個規則了
-
upp:目前看起來是否還可能是「全部大寫」- 一旦我看到任何小寫,就不可能是全部大寫了
掃描過程中只要同時變成:
low == false且upp == false代表三種情況都不可能了(也不可能是全小寫),可以直接回傳false。
最後只要 low 或 upp 其中一個還成立,就回傳 true。
(全小寫的情況會讓 low 一直維持 true,所以也會被正確接受。)
所有變數
word:輸入字串low:是否仍可能符合「只有第一個字母大寫,其餘小寫」upp:是否仍可能符合「全部大寫」
🪜 主要流程步驟
1. 長度小於 2 直接回傳 true
- 單一字母不管大寫或小寫都符合規則
2. 初始化兩種可能性
low = trueupp = true
3. 一次掃描字串,逐字排除不可能的規則
對每個索引 i:
-
若
word[i]是大寫且i > 0- 代表不是「只有第一個字母大寫,其餘小寫」
low = false
-
若
word[i]是小寫- 代表不是「全部大寫」
upp = false
-
若同時
low == false且upp == false- 代表沒有任何合法形式能成立,直接回傳
false
- 代表沒有任何合法形式能成立,直接回傳
4. 迴圈結束後檢查是否仍有合法形式
- 若
low || upp為真,回傳true - 否則回傳
false
💻 程式碼實作
class Solution {
public:
bool detectCapitalUse(string word) {
if (word.size() < 2) {
return true;
}
bool low = true, upp = true;
for (int i = 0; i < word.size(); i++) {
if (isupper(word[i]) && i > 0) {
low = false;
} else if (islower(word[i])) {
upp = false;
}
if (!low && !upp) {
return false;
}
}
if (low || upp) {
return true;
}
return false;
}
};
🔗 題目連結
https://leetcode.com/problems/detect-capital/