🔗 🟢 520. Detect Capital

tags: 字串(String)

題意

大寫字母的使用方式有以下三種:

  • 全部字母都是大寫,如 "USA"
  • 全部字母都不是大寫,如 "leetcode"
  • 只有第一個字母是大寫,如 "Google"

給定一個字串 wordword,判斷其大寫字母的使用方式是否正確。

思路

方法一:合併每種情況的判斷

要分別判斷三個條件顯然是比較容易的,但這樣需要三次遍歷,因此可以合併成一次遍歷,並使用三個變數來記錄是否符合條件。

ck1ck1ck2ck2ck3ck3 分別表示是否全為小寫、全為大寫、第一個字母為大寫,初始值均為 TrueTrue

  • 當遇到小寫字母時,ck1ck1 置為 FalseFalse,並且如果是第一個字母,ck3ck3 也置為 FalseFalse
  • 當遇到大寫字母時,ck2ck2 置為 FalseFalse,並且如果不是第一個字母,ck3ck3 也置為 FalseFalse

最後返回 ck1ck2ck3ck1 \lor ck2 \lor ck3 即可。

複雜度分析

  • 時間複雜度:O(n)\mathcal{O}(n)
  • 空間複雜度:O(1)\mathcal{O}(1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:
def detectCapitalUse(self, word: str) -> bool:
# return word.isupper() or word.islower() or word.istitle()
ck1 = ck2 = ck3 = True
for i, ch in enumerate(word):
if ch.islower():
ck1 = False
if i == 0:
ck3 = False
else:
ck2 = False
if i > 0:
ck3 = False
return ck1 or ck2 or ck3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
bool detectCapitalUse(string word) {
bool ck1 = true, ck2 = true, ck3 = true;
for (int i = 0; i < word.size(); i++) {
if (islower(word[i])) {
ck1 = false;
if (i == 0) ck3 = false;
}
else {
ck2 = false;
if (i > 0) ck3 = false;
}
}
return ck1 || ck2 || ck3;
}
};

方法二:統計大寫字母的出現次數

但上述方法很不簡潔,因此可以轉換思路,統計大寫字母的出現次數,然後判斷是否符合條件。

  • 如果大寫字母的出現次數為 00,則符合條件 11
  • 如果大寫字母的出現次數等於字串長度,則符合條件 22
  • 如果大寫字母的出現次數為 11,且第一個字母為大寫,則符合條件 33

複雜度分析

  • 時間複雜度:O(n)\mathcal{O}(n)
  • 空間複雜度:O(1)\mathcal{O}(1)
1
2
3
4
class Solution:
def detectCapitalUse(self, word: str) -> bool:
cnt = sum(ch.isupper() for ch in word)
return cnt == 0 or cnt == len(word) or cnt == 1 and word[0].isupper()
1
2
3
4
5
6
7
8
class Solution {
public:
bool detectCapitalUse(string word) {
int cnt = 0;
for (char ch : word) cnt += isupper(ch) ? 1 : 0;
return cnt == 0 || cnt == word.size() || (cnt == 1 && isupper(word[0]));
}
};

參考資料


寫在最後

Cover photo is generated by @たろたろ, thanks for their work!