一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
题目
我们定义,在以下情况时,单词的大写用法是正确的:
- 全部字母都是大写,比如
"USA"。 - 单词中所有字母都不是大写,比如
"leetcode"。 - 如果单词不只含有一个字母,只有首字母大写, 比如
"Google"。
给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。
示例 1:
输入:word = "USA"
输出:true
示例 2:
输入:word = "FlaG"
输出:false
提示:
1 <= word.length <= 100word由小写和大写英文字母组成
思考
本题难度简单,不过解题思路有点意思!
首先,我们要理解题意,题目说的是返回true的只有以下3种情况:
-
全部字母都是大写,比如 "USA"
-
全部字母都是小写,比如 "leetcode"
-
只有首字母大写,比如 "Google"
那么,我们只需要判断给出的字符串是否满足以上3种情况即可。不过,我们应该如何去判断呢?
方法一是借鉴了官方解法。我们注意到字符串的第 1 个字母为小写时,需判断第 2 个字母是否为小写,如果第2个字符为大写,就返回false。此外,字符串从第3个字母开始,必须与第 2 个字母的大小写相同。因此,我们可以简化下判断方法,只需要考虑字符串是否满足以上2个条件接口。考虑到我们需要遍历字符串进行判断,因此时间复杂度是O(n)。
方法二中,我们借助了正则表达式进行判断。考虑到题目中给出的3种情况很有规律,用正则表达式匹配很容易写出来(最近学了很多正则表达式的奇技淫巧...🎨),那么这道题就很容易地解决了。而且,使用正则表达式还有一个优点,那就是代码的执行效率很高效!
解答
方法一:
var detectCapitalUse = function(word) {
if (word.length >= 2 && word[0] === word[0].toLowerCase() && word[1] === word[1].toUpperCase()) {
return false;
}
for (let i = 2; i < word.length; ++i) {
if (word[i] === word[i].toLowerCase() ^ word[1] === word[1].toLowerCase()) {
return false;
}
}
return true;
}
复杂度分析
- 时间复杂度:O(n),其中 n 为字符串的长度。我们需要遍历字符串中的每个字符。
- 空间复杂度:O(1)。
方法二:正则
var detectCapitalUse = function(word) {
let reg = /^[A-Z]+$|^[a-z]+$|^[A-Z][a-z]+$/
return reg.test(word)
}