3813. Vowel-Consonant Score

練習日期:2026-01-18

難度:Easy

類型:String、Simulation、Weekly Contest 485

📘 題目敘述

給定一個字串 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 <= 100
  • s 只包含小寫英文字母、空白與數字

🧠 解題思路

這題的核心非常單純,是一題「字元分類 + 計數」的問題。

我的想法是:

  • 只關心 英文字母
  • 其他字元(空白、數字)完全忽略
  • 對於英文字母:
    • 如果是母音,就累加 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 / uv++
  • 否則: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/

作者: scottnick
撰寫日期: 2026-01-18
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/3813-vowel-consonant-score.html