【周赛266】leetcode5919.所有子字符串中的元音

题目:
给你一个字符串 word ,返回 word 的所有子字符串中 元音的总数 ,元音是指 ‘a’、‘e’、‘i’、‘o’ 和 ‘u’ 。

子字符串 是字符串中一个连续(非空)的字符序列。

注意:由于对 word 长度的限制比较宽松,答案可能超过有符号 32 位整数的范围。计算时需当心。
【周赛266】leetcode5919.所有子字符串中的元音_第1张图片

解答:
方法一:利用前缀和

class Solution:
    def countVowels(self, word: str) -> int:
        n=len(word)
        presum=[0]*(n+1)
        for i in range(n):
            c=word[i]
            if c in 'aeiou':
                presum[i+1]=presum[i]+1
            else:
                presum[i+1]=presum[i]
        
        res=0
        for i in range(n):
            #以i为结束点,以j为开始点
            for j in range(i+1):
                res+=presum[i+1]-presum[j]
        return res
        

方法二:前缀和+前缀和
通过对方法一的观察,可以看出:在内层循环中,presum[i+1]重复加了(i+1)次,而减数为:presum[0]+presum[1]+…+presum[i]。所以可以再对presum做一次前缀和,去掉内层循环,将时间复杂度由O(n^2)降为O(n)。

class Solution:
    def countVowels(self, word: str) -> int:
        n=len(word)
        presum=[0]*(n+1)
        for i in range(1,n+1):
            c=word[i-1]
            if c in 'aeiou':
                presum[i]=presum[i-1]+1
            else:
                presum[i]=presum[i-1]
        #print(presum)

        #对presum再做前缀和
        pre2=[0]*(n+1)
        for i in range(1,n+1):
            pre2[i]=pre2[i-1]+presum[i]
        #print(pre2)

        res=0
        for i in range(n):
            #以i为结束点,以j为开始点
            res+=presum[i+1]*(i+1)-pre2[i]
        return res
        

你可能感兴趣的:(Python,leetcode,leetcode,算法,职场和发展)