检测大写字母

标签: 字符串

难度: Easy

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

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

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

示例 1:

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

示例 2:

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

提示:

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

Submission

运行时间: 16 ms

内存: 15.9 MB

class Solution(object):
    def detectCapitalUse(self, word):
        """
        :type word: str
        :rtype: bool
        """
        if word == word.upper() or word == word.lower() or word == word.title():
            return True
        else:
            return False

Explain

这个题解的思路是判断给定的单词 word 是否满足以下三种情况之一:1. 所有字母都是大写(word.upper());2. 所有字母都是小写(word.lower());3. 只有首字母大写,其余字母都是小写(word.title())。如果满足其中任意一种情况,则返回 True,否则返回 False。

时间复杂度: O(n)

空间复杂度: O(n)

class Solution(object):
    def detectCapitalUse(self, word):
        """
        :type word: str
        :rtype: bool
        """
        # 如果单词全部大写,或全部小写,或只有首字母大写,则返回 True
        if word == word.upper() or word == word.lower() or word == word.title():
            return True
        else:
            return False

Explore

使用`word.title()`方法来检查单词是否只有首字母大写的原因是因为这个方法会将字符串的每个单词的首字母大写,其余字母小写。然而,当字符串包含非字母字符或连字符等分隔符时,这种方法可能不适用。例如,`word.title()`会将"hello-world"转换为"Hello-World",因此如果输入是"hello-world",使用`word.title()`会错误地认为不符合条件。

`word.upper()`和`word.lower()`方法对于非字母字符如数字或符号不会产生变化,它们仅对字母字符进行大小写转换。这意味着这些方法在检测大写或小写时不会忽略这些非字母字符,但这些字符不影响检测结果,因为它们在转换过程中保持不变。

该算法主要涉及对给定字符串执行三次大小写转换检查(`upper`, `lower`, `title`),每个操作的时间复杂度都是O(n),其中n是字符串的长度。因此,总的时间复杂度是O(n)。对于长度达到100字符的字符串,这个时间复杂度是可接受的,尽管执行三次转换会有一定的性能开销。但通常在实际应用中,这种性能是足够的。没有特定的性能测试数据,但按照常见的字符串操作性能来看,该算法应对此类情况表现良好。

使用正则表达式是一个可行的替代方案,它可以通过一个表达式来检查所有三种条件是否满足。正则表达式的优势在于它可以在一个表达式中更清晰地定义所需的模式匹配规则,可能更容易适应复杂的或特定的字符处理需求。然而,正则表达式的劣势可能包括对于初学者来说较难理解和维护,以及在某些情况下可能比直接字符串方法性能稍差。总的来说,选择正则表达式或字符串方法取决于具体的应用场景和性能需求。