24行代码-Leecode 2063. 所有子字符串中的元音——Leecode周赛系列

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了24行代码-Leecode 2063. 所有子字符串中的元音——Leecode周赛系列相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode-cn.com/problems/vowels-of-all-substrings/


题解汇总:https://zhanglong.blog.csdn.net/article/details/121071779


题目描述

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

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

注意:由于对 word 长度的限制比较宽松,答案可能超过有符号 32 位整数的范围。计算时需当心。

示例 1:
输入:word = “aba”
输出:6
解释:
所有子字符串是:“a”、“ab”、“aba”、“b”、“ba” 和 “a” 。
“b” 中有 0 个元音
“a”、“ab”、“ba” 和 “a” 每个都有 1 个元音
“aba” 中有 2 个元音
因此,元音总数 = 0 + 1 + 1 + 1 + 1 + 2 = 6 。

示例 2:
输入:word = “abc”
输出:3
解释:
所有子字符串是:“a”、“ab”、“abc”、“b”、“bc” 和 “c” 。
“a”、“ab” 和 “abc” 每个都有 1 个元音
“b”、“bc” 和 “c” 每个都有 0 个元音
因此,元音总数 = 1 + 1 + 1 + 0 + 0 + 0 = 3 。

示例 3:
输入:word = “ltcd”
输出:0
解释:“ltcd” 的子字符串均不含元音。

示例 4:
输入:word = “noosabasboosa”
输出:237
解释:所有子字符串中共有 237 个元音。

提示:
1 <= word.length <= 105
word 由小写英文字母组成


思路一:数学规律

以abcde字符串为例,每个部分出现的次数可以拆分成:

  • a出现的次数: ( 5 − 1 ) + ( ( 5 − 0 ) ∗ 0 ) + 1 (5-1) + ((5-0)*0) + 1 (51)+((50)0)+1;
  • b出现的次数: ( 5 − 2 ) + ( ( 5 − 1 ) ∗ 1 ) + 1 (5-2) + ((5-1)*1) + 1 (52)+((51)1)+1;
  • c出现的次数: ( 5 − 3 ) + ( ( 5 − 2 ) ∗ 2 ) + 1 (5-3) + ((5-2)*2) + 1 (53)+((52)2)+1;
  • d出现的次数: ( 5 − 4 ) + ( ( 5 − 3 ) ∗ 3 ) + 1 (5-4) + ((5-3)*3) + 1 (54)+((53)3)+1;
  • e出现的次数: ( 5 − 5 ) + ( ( 5 − 4 ) ∗ 4 ) + 1 (5-5) + ((5-4)*4) + 1 (55)+((54)4)+1;

编写代码即可:

class Solution {
private:
    const long long MAX_LEN = 100005;
    long long arr[100005] = {0};
public:
    long long countVowels(string word) {
        long long res = 0;
        long long len = word.length();

        // 第一部分
        for(int i = 0; i < len; i++) {
            arr[i] += len-1-i;
        }
        for(int i = 0; i < len; i++) {
            arr[i] += (len - i) * (i);		// 第二部分
            arr[i] += 1;					// 第三部分
        }
        for(int i = 0; i < len; i++) {
            if(word[i] == 'a' || word[i] == 'e'|| word[i] == 'i'|| word[i] == 'o'|| word[i] == 'u') {
                res += arr[i];
            }
        }
        return res;
    }
};

以上是关于24行代码-Leecode 2063. 所有子字符串中的元音——Leecode周赛系列的主要内容,如果未能解决你的问题,请参考以下文章

Leecode03. 无重复字符的最长子串——Leecode大厂热题100道系列

Leecode03. 无重复字符的最长子串——Leecode大厂热题100道系列

leecode 3. 无重复字符的最长子串

Leecode-无重复字符的最长子串

LeeCode 无重复字符串的最长子串

LeeCode 无重复字符串的最长子串