列表

详情


3305. 元音辅音字符串计数 I

给你一个字符串 word 和一个 非负 整数 k

返回 word子字符串 中,每个元音字母('a''e''i''o''u'至少 出现一次,并且 恰好 包含 k 个辅音字母的子字符串的总数。

 

示例 1:

输入:word = "aeioqq", k = 1

输出:0

解释:

不存在包含所有元音字母的子字符串。

示例 2:

输入:word = "aeiou", k = 0

输出:1

解释:

唯一一个包含所有元音字母且不含辅音字母的子字符串是 word[0..4],即 "aeiou"

示例 3:

输入:word = "ieaouqqieaouqq", k = 1

输出:3

解释:

包含所有元音字母并且恰好含有一个辅音字母的子字符串有:

 

提示:

相似题目

所有元音按顺序排布的最长子字符串

统计字符串中的元音子字符串

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int countOfSubstrings(string word, int k) { } };

java 解法, 执行用时: 1 ms, 内存消耗: 41.6 MB, 提交时间: 2024-10-09 22:05:34

class Solution {
    public int countOfSubstrings(String word, int k) {
        final int VOWEL_MASK = 1065233;
        char[] s = word.toCharArray();
        int ans = 0;
        int[] cntVowel1 = new int['u' - 'a' + 1], cntVowel2 = new int['u' - 'a' + 1];
        int sizeVowel1 = 0, sizeVowel2 = 0; // 元音种类数
        int cntConsonant1 = 0, cntConsonant2 = 0;
        int left1 = 0, left2 = 0;
        for (char b : s) {
            b -= 'a';
            if ((VOWEL_MASK >> b & 1) > 0) {
                if (cntVowel1[b]++ == 0) {
                    sizeVowel1++;
                }
                if (cntVowel2[b]++ == 0) {
                    sizeVowel2++;
                }
            } else {
                cntConsonant1++;
                cntConsonant2++;
            }

            while (sizeVowel1 == 5 && cntConsonant1 >= k) {
                int out = s[left1] - 'a';
                if ((VOWEL_MASK >> out & 1) > 0) {
                    if (--cntVowel1[out] == 0) {
                        sizeVowel1--;
                    }
                } else {
                    cntConsonant1--;
                }
                left1++;
            }

            while (sizeVowel2 == 5 && cntConsonant2 > k) {
                int out = s[left2] - 'a';
                if ((VOWEL_MASK >> out & 1) > 0) {
                    if (--cntVowel2[out] == 0) {
                        sizeVowel2--;
                    }
                } else {
                    cntConsonant2--;
                }
                left2++;
            }

            ans += left1 - left2;
        }
        return ans;
    }
}

python3 解法, 执行用时: 47 ms, 内存消耗: 16.6 MB, 提交时间: 2024-10-09 22:02:42

class Solution:
    def countOfSubstrings(self, word: str, k: int) -> int:
        cnt_vowel1 = defaultdict(int)
        cnt_vowel2 = defaultdict(int)
        cnt_consonant1 = cnt_consonant2 = 0
        ans = left1 = left2 = 0
        for b in word:
            if b in "aeiou":
                cnt_vowel1[b] += 1
                cnt_vowel2[b] += 1
            else:
                cnt_consonant1 += 1
                cnt_consonant2 += 1

            while len(cnt_vowel1) == 5 and cnt_consonant1 >= k:
                out = word[left1]
                if out in "aeiou":
                    cnt_vowel1[out] -= 1
                    if cnt_vowel1[out] == 0:
                        del cnt_vowel1[out]
                else:
                    cnt_consonant1 -= 1
                left1 += 1

            while len(cnt_vowel2) == 5 and cnt_consonant2 > k:
                out = word[left2]
                if out in "aeiou":
                    cnt_vowel2[out] -= 1
                    if cnt_vowel2[out] == 0:
                        del cnt_vowel2[out]
                else:
                    cnt_consonant2 -= 1
                left2 += 1

            ans += left1 - left2
        return ans

上一题