520. 检测大写字母
520. 检测大写字母
题目
We define the usage of capitals in a word to be right when one of the following cases holds:
- All letters in this word are capitals, like
"USA"
. - All letters in this word are not capitals, like
"leetcode"
. - Only the first letter in this word is capital, like
"Google"
.
Given a string word
, return true
if the usage of capitals in it is right.
Example 1:
Input: word = "USA"
Output: true
Example 2:
Input: word = "FlaG"
Output: false
Constraints:
1 <= word.length <= 100
word
consists of lowercase and uppercase English letters.
题目大意
我们定义,在以下情况时,单词的大写用法是正确的:
- 全部字母都是大写,比如
"USA"
。 - 单词中所有字母都不是大写,比如
"leetcode"
。 - 如果单词不只含有一个字母,只有首字母大写, 比如
"Google"
。
给你一个字符串 word
。如果大写用法正确,返回 true
;否则,返回 false
。
示例 1:
输入: word = "USA"
输出: true
示例 2:
输入: word = "FlaG"
输出: false
提示:
1 <= word.length <= 100
word
由小写和大写英文字母组成
解题思路
思路一:字符串全等
可以直接检查以下三种情况之一是否成立。如果任意一种成立,则返回 true
,否则返回 false
。
- 全部大写: 判断
word
是否等于word.toUpperCase()
。 - 全部小写: 判断
word
是否等于word.toLowerCase()
。 - 首字母大写: 判断
word
是否等于word[0].toUpperCase()
拼接上word.slice(1).toLowerCase()
。
复杂度分析
- 时间复杂度:
O(n)
,其中n
是字符串的长度,每次对字符串操作(toUpperCase
,toLowerCase
, 或slice
)的时间复杂度为O(n)
。 - 空间复杂度:
O(1)
,所有操作只使用了固定的变量。
思路二:大写字母数量
辅助函数判断是否为大写字母:
- 使用
isUpper(char)
函数判断当前字母是否为大写。 - 大写字母的 ASCII 值范围是
[65, 90]
,也就是'A'.charCodeAt()
到'Z'.charCodeAt()
。
- 使用
统计大写字母的个数:
- 遍历整个单词,逐字符检查是否为大写,并记录大写字母的个数
upperCount
。
- 遍历整个单词,逐字符检查是否为大写,并记录大写字母的个数
判断大小写规则:
- 如果 大写字母的个数为 0,说明全部字母都是小写,满足条件。
- 如果 大写字母的个数等于单词长度,说明全部字母都是大写,满足条件。
- 如果 大写字母的个数为 1 且第一个字母是大写,说明单词是首字母大写,其余全小写,满足条件。
- 其他情况返回
false
。
复杂度分析
- 时间复杂度:
O(n)
,其中n
是字符串的长度,遍历单词统计大写字母的次数。 - 空间复杂度:
O(1)
,只使用了常量空间的计数器和变量。
代码
字符串全等
/**
* @param {string} word
* @return {boolean}
*/
var detectCapitalUse = function (word) {
// 全部大写 或 全部小写 或 首字母大写
return (
word === word.toUpperCase() ||
word === word.toLowerCase() ||
word === word[0].toUpperCase() + word.slice(1).toLowerCase()
);
};
大写字母数量
/**
* @param {string} word
* @return {boolean}
*/
var detectCapitalUse = function (word) {
// 辅助函数判断是否为大写字母
const isUpper = (char) =>
char.charCodeAt() >= 'A'.charCodeAt() &&
char.charCodeAt() <= 'Z'.charCodeAt();
let upperCount = 0; // 大写字母计数
for (let char of word) {
if (isUpper(char)) {
upperCount++; // 遇到大写字母,计数器加 1
}
}
// 判断三种合法情况
if (upperCount === 0 || upperCount === word.length) {
return true; // 全小写 或 全大写
}
if (upperCount === 1 && isUpper(word[0])) {
return true; // 首字母大写
}
return false; // 其他情况不符合规则
};
相关题目
题号 | 标题 | 题解 | 标签 | 难度 | 力扣 |
---|---|---|---|---|---|
2129 | 将标题首字母大写 | [✓] | 字符串 | 🟢 | 🀄️ 🔗 |
3120 | 统计特殊字母的数量 I | 哈希表 字符串 | 🟢 | 🀄️ 🔗 | |
3121 | 统计特殊字母的数量 II | 哈希表 字符串 | 🟠 | 🀄️ 🔗 |