📘 題目敘述
給定一個字串 s,字串中可能包含:
- 小寫英文字母
- 空白
- 數字
定義:
v:字串中 母音(vowels) 的數量c:字串中 子音(consonants) 的數量
母音為:a, e, i, o, u,其餘英文字母皆視為子音。
字串的 分數(score) 定義如下:
- 若
c > 0,則score = floor(v / c) - 若
c == 0,則score = 0
請回傳字串 s 的分數。
條件限制
1 <= s.length <= 100s只包含小寫英文字母、空白與數字
🧠 解題思路
這題的核心非常單純,是一題「字元分類 + 計數」的問題。
我的想法是:
- 只關心 英文字母
- 其他字元(空白、數字)完全忽略
- 對於英文字母:
- 如果是母音,就累加
v - 否則就是子音,累加
c
- 如果是母音,就累加
最後依照題目定義:
- 若
c > 0,回傳v / c(整數除法自然會向下取整) - 若
c == 0,直接回傳0
所有變數
v:母音數量(vowels count)c:子音數量(consonants count)n:字串s的長度i:用來逐字掃描字串的索引
🪜 主要流程步驟
步驟一:逐字掃描整個字串
- 使用一個 for 迴圈,從左到右掃過
s - 每一個字元
s[i]都做一次判斷
步驟二:只處理英文字母
- 如果
s[i]落在'a' ~ 'z'之間:- 才進一步判斷是母音還是子音
- 如果不是英文字母(空白、數字):
- 直接忽略,不做任何事
步驟三:分類母音與子音
- 若
s[i]是a / e / i / o / u:v++ - 否則:
c++
步驟四:計算分數
- 若
c > 0:回傳v / c - 若
c == 0:依題目規定回傳0
為什麼這樣做是正確的?
- 題目只在乎「母音數」與「子音數」
- 空白與數字完全不影響結果
- 使用整數除法即可自然達成
floor(v / c) - 邏輯直觀、時間複雜度為
O(n)
💻 程式碼實作
class Solution {
public:
int vowelConsonantScore(string s) {
int v = 0, c = 0;
int n = s.size();
for (int i = 0; i < n; i++) {
if (s[i] >= 'a' && s[i] <= 'z') {
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u') {
v++;
} else {
c++;
}
}
}
if (c > 0) {
return v / c;
} else {
return 0;
}
}
};
🔗 題目連結
https://leetcode.com/problems/vowel-consonant-score/