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 (5−1)+((5−0)∗0)+1;
- b出现的次数: ( 5 − 2 ) + ( ( 5 − 1 ) ∗ 1 ) + 1 (5-2) + ((5-1)*1) + 1 (5−2)+((5−1)∗1)+1;
- c出现的次数: ( 5 − 3 ) + ( ( 5 − 2 ) ∗ 2 ) + 1 (5-3) + ((5-2)*2) + 1 (5−3)+((5−2)∗2)+1;
- d出现的次数: ( 5 − 4 ) + ( ( 5 − 3 ) ∗ 3 ) + 1 (5-4) + ((5-3)*3) + 1 (5−4)+((5−3)∗3)+1;
- e出现的次数: ( 5 − 5 ) + ( ( 5 − 4 ) ∗ 4 ) + 1 (5-5) + ((5-4)*4) + 1 (5−5)+((5−4)∗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道系列