Given a string word, return the sum of the number of vowels ('a', 'e', 'i', 'o', and 'u') in every substring of word.
A substring is a contiguous (non-empty) sequence of characters within a string.
Note: Due to the large constraints, the answer may not fit in a signed 32-bit integer. Please be careful during the calculations.
題目會給我們一組字串word,我們要返回word所有子字串的母音出現次數,加總後返回。
題目還很貼心的提醒我們字串長度可能很大,但注意不能超過所以不能暴力破解。
老實說我看完題目的第一個想法確實是遍歷所有子字串後統計母音,直到我看到最後那段提示...
我最會的暴力破解被禁止了,好慌!!
思索良久後,我想到如果不能從子字串去數母音,那也許可以試試看從母音去數子字串?!
舉例來說:
如果字串是[q,w,e,r,t,y](長度n)
從母音e(位置i)開始切,分成兩種子字串
0開頭e結尾的子字串-qwe,we,e ------>有i+1個子字串
e開頭n結尾的子字串-erty,ert,er,e ------>有n-2個子字串
因為排列組合的原因,e一共提供了3*4=12個子字串!
所以從字串找出所有母音,再按照公式計算它貢獻了幾個子字串,最後加總返回就好。
有提字串長很大,計算時可能會超過32bit導致計算錯誤,所以需要用long來宣告
(幸好leetcode提供的開頭有long,不然我根本沒意識到題目的提示是這個意思)
class Solution {
public long countVowels(String word) {
long totalVowelCount = 0; // 使用long來處理可能過大的數值
int n = word.length();
// 遍歷字串找母音
for (int i = 0; i < n; i++) {
char c = word.charAt(i);
if (vowel(c)) {
// 計算當前母音的貢獻
long contribution = (long)(i + 1) * (n - i);
totalVowelCount += contribution;
}
}
return totalVowelCount;
}
private static boolean vowel(char c) {
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}
}
結束這回合!
這題目我覺得在構思邏輯的部分比較難,邏輯順了之後程式其實不難寫。