520. Detect Capital

練習日期:2026-02-04

難度:Easy

類型:String

📘 題目敘述

我們定義一個單字使用大寫(capitals)的方式是正確的,當且僅當符合以下其中一種情況:

  1. 這個單字的所有字母都是大寫,例如 "USA"
  2. 這個單字的所有字母都不是大寫(也就是全小寫),例如 "leetcode"
  3. 只有第一個字母是大寫,其餘字母都是小寫,例如 "Google"

給你一個字串 word,如果它使用大寫的方式正確就回傳 true,否則回傳 false

條件限制

  • 1 <= word.length <= 100
  • word 只由英文大小寫字母組成

🧠 解題思路

我用一次掃描,同時維護兩個「目前還有可能成立的規則」:

  • low:目前看起來是否還可能是「只有第一個字母大寫,其餘小寫」

    • 一旦我在第 2 個字母之後看到大寫,就不可能是這個規則了
  • upp:目前看起來是否還可能是「全部大寫」

    • 一旦我看到任何小寫,就不可能是全部大寫了

掃描過程中只要同時變成:

  • low == falseupp == false 代表三種情況都不可能了(也不可能是全小寫),可以直接回傳 false

最後只要 lowupp 其中一個還成立,就回傳 true。 (全小寫的情況會讓 low 一直維持 true,所以也會被正確接受。)

所有變數

  • word:輸入字串
  • low:是否仍可能符合「只有第一個字母大寫,其餘小寫」
  • upp:是否仍可能符合「全部大寫」

🪜 主要流程步驟

1. 長度小於 2 直接回傳 true

  • 單一字母不管大寫或小寫都符合規則

2. 初始化兩種可能性

  • low = true
  • upp = true

3. 一次掃描字串,逐字排除不可能的規則

對每個索引 i

  • word[i] 是大寫且 i > 0

    • 代表不是「只有第一個字母大寫,其餘小寫」
    • low = false
  • word[i] 是小寫

    • 代表不是「全部大寫」
    • upp = false
  • 若同時 low == falseupp == 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/

作者: scottnick
撰寫日期: 2026-02-04
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/520-detect-capital.html