力扣-520. 检测大写字母
1.题目
题目地址(520. 检测大写字母 - 力扣(LeetCode))
https://leetcode.cn/problems/detect-capital/
题目描述
我们定义,在以下情况时,单词的大写用法是正确的:
- 全部字母都是大写,比如
"USA"
。 - 单词中所有字母都不是大写,比如
"leetcode"
。 - 如果单词不只含有一个字母,只有首字母大写, 比如
"Google"
。
给你一个字符串 word
。如果大写用法正确,返回 true
;否则,返回 false
。
示例 1:
输入:word = "USA" 输出:true
示例 2:
输入:word = "FlaG" 输出:false
提示:
1 <= word.length <= 100
word
由小写和大写英文字母组成
2. 题解
2.1 模拟(列举所有情况)
思路
我们要知道:
1.无论首字母如何,第二个字符和以后得所有字符大小写形式都是一样的
2.如果首字母大写,第二个字符可大写可小写无需讨论; 如果首字母小写, 就要讨论一下第二字符必须是小写
代码
- 语言支持:C++
C++ Code:
class Solution {
public:
bool detectCapitalUse(string word) {
if(word.length() >= 2 && islower(word[0]) && isupper(word[1])) return false;
for(int i = 2; i < word.length(); i++){
if(islower(word[1]) ^ islower(word[i])) return false;
}
return true;
}
};
复杂度分析
令 n 为数组长度。
- 时间复杂度:\(O(n)\)
- 空间复杂度:\(O(n)\)
2.2 模拟2
思路
C++中没有Java中的toUpperCase 和 toLowerCase, 只有tolower 和 toupper 这种转换单个字符的函数, 或者是 islower 和 isupper 这种判断大小写的函数
这里尝试使用transform配合编写一个uppercase 和 lowercase
transform中四个参数, 这里由于函数是复制了一份string字符串过去, 并不过改动原有字符串的!!!
1.第一个参数是待转换范围的起始迭代器。
2.第二个参数是待转换范围的结束迭代器(不包含在转换范围内)。
3.第三个参数是转换后结果的存储位置的起始迭代器。
4.第四个参数是一个一元函数对象或函数指针,用于指定转换规则。
这里的谓词toupper和tolower前为何要加上::?
因为力扣中其实自带了 using namespace std;
而toupper和tolower, 在std命名空间中有一个, 在全局命名空间中也有一个, 我们必须指明用的是全局作用于的那个, 也就是用了::
代码
class Solution {
public:
bool detectCapitalUse(string word) {
if(uppercase(word) == word) return true; // 全部大写
if(lowercase(word) == word) return true; // 全部小写
if(isupper(word[0])){
string str = word.substr(1);
if(str == lowercase(str)) return true;
}
return false;
}
private:
// 将字符串转换为全部大写
string uppercase(string str) {
transform(str.begin(), str.end(), str.begin(), ::toupper);
return str;
}
// 将字符串转换为全部小写
string lowercase(string str) {
transform(str.begin(), str.end(), str.begin(), ::tolower);
return str;
}
};