iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0

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';
    }
}

結束這回合!
https://ithelp.ithome.com.tw/upload/images/20240928/201694328dktTQ3OBB.png
這題目我覺得在構思邏輯的部分比較難,邏輯順了之後程式其實不難寫。


上一篇
day-12[medium.2007]find original array from doubled array
下一篇
day-14[medium.2029]stone game IX
系列文
轉生理工組後從零開始的leetcode刷題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言