LeetCode探索(50):520-检测大写字母_借助正则表达式更高效地解决问题🚀

187 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

题目

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

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

给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false

示例 1:

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

示例 2:

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

提示:

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

思考

本题难度简单,不过解题思路有点意思!

首先,我们要理解题意,题目说的是返回true的只有以下3种情况:

  • 全部字母都是大写,比如 "USA"

  • 全部字母都是小写,比如 "leetcode"

  • 只有首字母大写,比如 "Google"

那么,我们只需要判断给出的字符串是否满足以上3种情况即可。不过,我们应该如何去判断呢?

方法一是借鉴了官方解法。我们注意到字符串的第 1 个字母为小写时,需判断第 2 个字母是否为小写,如果第2个字符为大写,就返回false。此外,字符串从第3个字母开始,必须与第 2 个字母的大小写相同。因此,我们可以简化下判断方法,只需要考虑字符串是否满足以上2个条件接口。考虑到我们需要遍历字符串进行判断,因此时间复杂度是O(n)

方法二中,我们借助了正则表达式进行判断。考虑到题目中给出的3种情况很有规律,用正则表达式匹配很容易写出来(最近学了很多正则表达式的奇技淫巧...🎨),那么这道题就很容易地解决了。而且,使用正则表达式还有一个优点,那就是代码的执行效率很高效

leetcode-beat-100

解答

方法一:

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)
}

参考