问题描述

我们定义,在以下情况时,单词的大写用法是正确的:

  • 全部字母都是大写,比如 "USA"
  • 单词中所有字母都不是大写,比如 "leetcode"
  • 如果单词不只含有一个字母,只有首字母大写,比如 "Google"

给定一个字符串 word,判断其大写使用是否正确。

解题思路

题目的三种合法情况可以归纳为三个独立的判断条件,满足其一即可:

辅助方法设计

  1. isAllUppercase(str):检查字符串中所有字符是否都是大写

    • 遍历每个字符,如果发现小写字母则返回 false
  2. isAllLowercase(str):检查字符串中所有字符是否都是小写

    • 遍历每个字符,如果发现大写字母则返回 false
  3. isFirstUppercase(str):检查是否首字母大写且其余字母小写

    • 先检查首字母是否大写
    • 如果是,从第二个字符开始遍历,发现大写字母则返回 false
    • 如果首字母不是大写,直接返回 false

主逻辑

1
return isAllLowercase(word) || isFirstUppercase(word) || isAllUppercase(word);

三个条件满足任意一个即返回 true

举例说明

输入 isAllLowercase isFirstUppercase isAllUppercase 结果
"USA" false false true true
"leetcode" true false false true
"Google" false true false true
"FlaG" false false false false
"g" true false false true
"G" false false true true

边界情况

  • 单字符单词:"a""A" 都算正确
  • 空字符串:虽然题目通常会给出非空输入,但需要考虑防御性编程

复杂度分析

  • 时间复杂度:O(n),最多遍历字符串三次(实际只需一次,三个条件互斥时可提前返回)。
  • 空间复杂度:O(1),没有使用额外数据结构。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package code.J520;

public class J520 {
private boolean isAllUppercase(String str) {
for (int i = 0; i < str.length(); i++) {
if (Character.isLowerCase(str.charAt(i))) return false;
}
return true;
}

private boolean isAllLowercase(String str) {
for (int i = 0; i < str.length(); i++) {
if (Character.isUpperCase(str.charAt(i))) return false;
}
return true;
}

private boolean isFirstUppercase(String str) {
if (Character.isUpperCase(str.charAt(0))) {
for (int i = 1; i < str.length(); i++) {
if (Character.isUpperCase(str.charAt(i))) return false;
}
return true;
}
return false;
}

public boolean detectCapitalUse(String word) {
return isAllLowercase(word) || isFirstUppercase(word) || isAllUppercase(word);
}
}