1456. 定長子串中元音的最大數(shù)目

方法一:滑動窗口 + 匿名函數(shù)
類比 OS 中的基地址概念,將前k個字母構成的子字符串中元音字母的個數(shù)計算出來,然后以此開始遍歷從k位序開始的s串中的所有字母,動態(tài)的加上當前字母而減去最左段的字母,數(shù)值計算依賴于其字母是否為元音,元音則加減1,否則數(shù)值大小不變,利用滑動數(shù)組動態(tài)的更新遍歷過程中的最大元音字母個數(shù)
Python版本
?
C++版本
?
復雜度分析
時間復雜度:O(N)。此處的 n 指的是字符串 s 的長度,值域為 [1, 100000]。
空間復雜度:O(N)。同上,因為 k的值域可能為 [1, 100000]。
備注
我之前的解決思路是:利用左右指針確定連續(xù)元音字母的邊界,但這種思路建立在一個錯誤的前提上,即元音字母連續(xù)出現(xiàn);
而題目要求的是:包含元音字母最多的,既沒有限制種類,也沒有限制連續(xù)性,僅有子字符串是要求連續(xù)的
當我想用雙端隊列來做滑窗,每次向右移動一個位置,左邊去掉一個字母,但這次我還需要動態(tài)計算雙端隊列中元音的個數(shù),或者說,我需要維護一個定長數(shù)組,這種思路很耗費資源
題解的思路是:首先計算默認長度為k的字符串的元音字母的個數(shù),然后遍歷k長度起的所有字符,右邊加一個左邊減一個,將原本的遍歷統(tǒng)計元音字母個數(shù)的方式,改為動態(tài)累加新加入字母與刪除字母的元音個數(shù)
總體而言,將一個滑窗問題轉換了數(shù)學計算
反思:解題時仍然按照傳統(tǒng)的雙指針思路思考解題方法,基于錯誤的認知解題,嘗試了很多不同的方式; 第二點是思維能錄差異:并沒有思考將問題建模為數(shù)學的思路,或者在線算法等思路; 使用雙端隊列時,并沒有根據(jù)插入刪除字符計算元音字母個數(shù),而是直接遍歷整個區(qū)間字符串統(tǒng)計元音字母個數(shù)
解耦
匿名函數(shù)具有三段式的美感,既然我們都為函數(shù)注明了參數(shù)和返回值類型,那么何不對匿名函數(shù)也這么做呢;
注意匿名函數(shù)中的捕獲問題,本題中匿名函數(shù)使用了外部的函數(shù)來計算元音字母的個數(shù),需要判斷的函數(shù)其寫入捕獲列表;