目录
思路
首先,我们需要明确题目中给出的三种大写用法正确的情况:
- 全部字母都是大写,如 "USA"。
- 单词中所有字母都不是大写,即全部小写,如 "leetcode"。
- 如果单词不只含有一个字母,只有首字母大写,如 "Google"。
接着,我们可以编写一个Java方法detectCapitalUse
来检查给定的字符串word
是否符合上述三种情况之一。
解题方法
-
检查字符串
word
的长度。如果长度为0或1,那么它的大写用法自然是正确的,直接返回true
。 -
检查第一个字符是否为大写。根据第一个字符是否为大写,我们可以将后续的检查分为两种情况:
- 如果第一个字符是大写,我们需要进一步检查第二个字符是否也是大写。
- 如果第二个字符也是大写,那么后续所有字符都必须是大写。
- 如果第二个字符不是大写,那么后续所有字符都必须是小写。
- 如果第一个字符不是大写(即小写),那么后续所有字符都不能是大写。
- 如果第一个字符是大写,我们需要进一步检查第二个字符是否也是大写。
-
使用循环遍历字符串
word
(从第二个字符开始),根据前面的判断来检查后续字符是否符合规则。 -
如果在遍历过程中发现任何不符合规则的字符,就返回
false
。 -
如果循环结束都没有发现不符合规则的字符,那么返回
true
,表示word
的大写用法是正确的。
时间复杂度
- 我们需要遍历整个字符串一次来检查每个字符,因此时间复杂度是O(n),其中n是字符串
word
的长度。
空间复杂度
- 该方法没有使用额外的数据结构来存储数据,只使用了几个变量来记录状态,因此空间复杂度是O(1)。
Code
public class Solution {
public boolean detectCapitalUse(String word) {
int n = word.length();
// 如果字符串为空或只有一个字符,直接返回true
if (n == 0 || n == 1) {
return true;
}
// 检查第一个字符是否大写
boolean isFirstUpperCase = Character.isUpperCase(word.charAt(0));
// 检查第二个字符是否大写
boolean isSecondUpperCase = Character.isUpperCase(word.charAt(1));
// 根据第一个字符是否大写,判断后续的字符是否符合规则
if (isFirstUpperCase) {
// 如果第一个字符是大写
if (isSecondUpperCase) {
// 如果第二个字符也是大写,则后续所有字符都必须大写
for (int i = 2; i < n; i++) {
if (!Character.isUpperCase(word.charAt(i))) {
return false;
}
}
} else {
// 如果第二个字符不是大写,则后续所有字符都必须小写
for (int i = 2; i < n; i++) {
if (Character.isUpperCase(word.charAt(i))) {
return false;
}
}
}
} else {
// 如果第一个字符不是大写,则后续所有字符都不能是大写
for (int i = 1; i < n; i++) {
if (Character.isUpperCase(word.charAt(i))) {
return false;
}
}
}
// 如果所有检查都通过,返回true
return true;
}
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.detectCapitalUse("USA")); // 输出: true
System.out.println(solution.detectCapitalUse("FlaG")); // 输出: false
System.out.println(solution.detectCapitalUse("Google")); // 输出: true
System.out.println(solution.detectCapitalUse("leetcode"));// 输出: true
}
}
总结
- 解题思路是基于题目给出的三种大写用法正确的情况进行逻辑判断。
- 解题方法是通过遍历字符串并使用条件语句来检查每个字符是否符合规则。
- 时间复杂度是O(n),空间复杂度是O(1)。