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,具体流程如图所示。
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;
}
};
Comments | 0 条评论