0520. Detect Capital¶
Given a word, you need to judge whether the usage of capitals in it is right or not.
We define the usage of capitals in a word to be right when one of the following cases holds:
- All letters in this word are capitals, like "USA".
- All letters in this word are not capitals, like "leetcode".
- Only the first letter in this word is capital, like "Google".
Otherwise, we define that this word doesn't use capitals in a right way.
Example 1:
Input: "USA"
Output: True
Example 2:
Input: "FlaG"
Output: False
Note: The input will be a non-empty word consisting of uppercase and lowercase latin letters.
Analysis¶
There are two cases (it's actually three but we can merge the first two together) to consider:
- If the first character is upper case, then the rest has to be all upper case or all lower case.
- If the first character is lower case, then the rest has to be all lower case.
After the observation, we find we essentially just need three variables:
allCap: excluding the first character, the rest of the substring is all capitals.
allLower: excluding the first character, the rest of the substring is all capitals.
firstCap: the first character is capital.
Note that !allCap is not allLower.
Code¶
class Solution {
public:
bool detectCapitalUse(string word) {
if (word.empty()) return true;
bool allCap = true, firstCap = false, allLower = true;
for (int i = 0; i < word.size(); ++i) {
if (i == 0 && isupper(word[i])) firstCap = true;
if (i != 0 && !isupper(word[i])) allCap = false;
if (i != 0 && isupper(word[i])) allLower = false;
}
return allLower || (firstCap && allCap);
}
};