Easy
题目描述
我们定义一个单词中大写字母的使用是正确的,当且仅当下列情况之一成立:
- 这个单词中的所有字母都是大写字母,比如 “USA”。
- 这个单词中的所有字母都不是大写字母,比如 “leetcode”。
- 这个单词中只有第一个字母是大写字母,比如 “Google”。
给你一个字符串 word,如果大写字母的使用是正确的,返回 true;否则,返回 false。
示例 1:
输入:word = "USA"
输出:true
示例 2:
输入:word = "FlaG"
输出:false
提示:
1 <= word.length <= 100word由小写和大写英文字母组成
解题思路
这道题需要判断一个单词的大写字母使用是否正确。根据题目描述,正确的使用方式有三种:
- 全部大写:所有字母都是大写
- 全部小写:所有字母都是小写
- 首字母大写:只有第一个字母大写,其余都是小写
解法一:直接判断(推荐) 我们可以直接检查这三种情况:
- 检查是否全部大写
- 检查是否全部小写
- 检查是否只有首字母大写
解法二:计数法 统计大写字母的个数:
- 如果大写字母个数为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) 是因为只使用了常数级别的额外空间。