Easy

题目描述

我们定义一个单词中大写字母的使用是正确的,当且仅当下列情况之一成立:

  • 这个单词中的所有字母都是大写字母,比如 “USA”。
  • 这个单词中的所有字母都不是大写字母,比如 “leetcode”。
  • 这个单词中只有第一个字母是大写字母,比如 “Google”。

给你一个字符串 word,如果大写字母的使用是正确的,返回 true;否则,返回 false

示例 1:

输入:word = "USA"
输出:true

示例 2:

输入:word = "FlaG"
输出:false

提示:

  • 1 <= word.length <= 100
  • word 由小写和大写英文字母组成

解题思路

这道题需要判断一个单词的大写字母使用是否正确。根据题目描述,正确的使用方式有三种:

  1. 全部大写:所有字母都是大写
  2. 全部小写:所有字母都是小写
  3. 首字母大写:只有第一个字母大写,其余都是小写

解法一:直接判断(推荐) 我们可以直接检查这三种情况:

  • 检查是否全部大写
  • 检查是否全部小写
  • 检查是否只有首字母大写

解法二:计数法 统计大写字母的个数:

  • 如果大写字母个数为0,说明全小写,正确
  • 如果大写字母个数等于字符串长度,说明全大写,正确
  • 如果大写字母个数为1且第一个字符是大写,说明首字母大写,正确
  • 其他情况都不正确

两种方法的时间复杂度都是O(n),空间复杂度都是O(1)。第一种方法更直观易懂,代码实现上也更简洁。

代码实现

class Solution {
public:
    bool detectCapitalUse(string word) {
        // 全部大写
        if (word == string(word.size(), '\0')) {
            bool allUpper = true;
            for (char c : word) {
                if (!isupper(c)) {
                    allUpper = false;
                    break;
                }
            }
            if (allUpper) return true;
        }
        
        // 全部小写
        bool allLower = true;
        for (char c : word) {
            if (!islower(c)) {
                allLower = false;
                break;
            }
        }
        if (allLower) return true;
        
        // 首字母大写,其余小写
        if (isupper(word[0])) {
            bool restLower = true;
            for (int i = 1; i < word.size(); i++) {
                if (!islower(word[i])) {
                    restLower = false;
                    break;
                }
            }
            if (restLower) return true;
        }
        
        return false;
    }
};
class Solution:
    def detectCapitalUse(self, word: str) -> bool:
        # 全部大写
        if word.isupper():
            return True
        
        # 全部小写
        if word.islower():
            return True
        
        # 首字母大写,其余小写
        if word[0].isupper() and word[1:].islower():
            return True
        
        return False
public class Solution {
    public bool DetectCapitalUse(string word) {
        // 全部大写
        if (word.All(char.IsUpper)) {
            return true;
        }
        
        // 全部小写
        if (word.All(char.IsLower)) {
            return true;
        }
        
        // 首字母大写,其余小写
        if (char.IsUpper(word[0]) && word.Skip(1).All(char.IsLower)) {
            return true;
        }
        
        return false;
    }
}
/**
 * @param {string} word
 * @return {boolean}
 */
var detectCapitalUse = function(word) {
    return word === word.toUpperCase() || 
           word === word.toLowerCase() || 
           (word[0] === word[0].toUpperCase() && word.slice(1) === word.slice(1).toLowerCase());
};

复杂度分析

复杂度类型
时间复杂度O(n)
空间复杂度O(1)

其中 n 是字符串的长度。时间复杂度为 O(n) 是因为需要遍历字符串检查每个字符;空间复杂度为 O(1) 是因为只使用了常数级别的额外空间。

相关题目