520. 检测大写字母

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

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

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

示例 1:

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

示例 2:

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

思路

ac表示当前状态,state表示输入状态
由第一个字母大小写决定ac初状态
word[0]大写:ac初状态0
word[0]小写:ac初状态2
当ac初状态0时(即首字母大写):下一个字母可以大写,也可以小写
当ac初状态2时(即首字母小写):下一个字母只能小写
当ac状态为1时(即前n个字母均大写):下一个字母只能大写
当ac状态为2时(即当前字母小写):下一个字母只能小写
以上状态转移失败均跳转到ac=4,具体流程如图所示。

520 检测大写字母.png

python实现:

class Solution:
    def detectCapitalUse(self, word: str) -> bool:
        machine = [
            {0:1,1:2},
            {0:1,1:3},
            {0:3,1:2},
            {0:3,1:3}
        ]
        ac = 0
        if 'A'<=word[0]<='Z': ac = 0
        elif 'a'<=word[0]<='z': ac = 2
        for each in word[1:]:
            state = 0
            if 'A'<=each<='Z': state = 0
            elif 'a'<=each<='z': state = 1
            if machine[ac][state]==3:
                return False
            else: ac = machine[ac][state]
        return True

C++实现:

class Solution {
public:
    bool detectCapitalUse(string word) {
        int machine[4][2]={
            {1,2},
            {1,3},
            {3,2},
            {3,3}
        };
        int ac = 0;
        if('A'<=word[0]&&word[0]<='Z') ac = 0;
        else if('a'<=word[0]&&word[0]<='z') ac = 2;
        for(int i=1;i<word.size();i++){
            int state = 0;
            if('A'<=word[i]&&word[i]<='Z') state = 0;
            else if('a'<=word[i]&&word[i]<='z') state = 1;
            if(machine[ac][state]==3) return false;
            else ac=machine[ac][state];
        }
        return true;
    }

};