leetcode-pp / 91alg-7-daily-check

6 stars 0 forks source link

【Day 43 】2022-05-13 - 1456. 定长子串中元音的最大数目 #47

Open azl397985856 opened 2 years ago

azl397985856 commented 2 years ago

1456. 定长子串中元音的最大数目

入选理由

暂无

题目地址

https://leetcode-cn.com/problems/maximum-number-of-vowels-in-a-substring-of-given-length

前置知识

暂无

题目描述

给你字符串 s 和整数 k 。

请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。

英文中的 元音字母 为(a, e, i, o, u)。

示例 1:

输入:s = "abciiidef", k = 3
输出:3
解释:子字符串 "iii" 包含 3 个元音字母。
示例 2:

输入:s = "aeiou", k = 2
输出:2
解释:任意长度为 2 的子字符串都包含 2 个元音字母。
示例 3:

输入:s = "leetcode", k = 3
输出:2
解释:"lee"、"eet" 和 "ode" 都包含 2 个元音字母。
示例 4:

输入:s = "rhythms", k = 4
输出:0
解释:字符串 s 中不含任何元音字母。
示例 5:

输入:s = "tryhard", k = 4
输出:1

提示:

1 <= s.length <= 10^5
s 由小写英文字母组成
1 <= k <= s.length
ShuqianYang commented 2 years ago

class Solution:
    def maxVowels(self, s: str, k: int) -> int:
        res = 0
        temp = 0
        vowels = set(['a','e','i','o','u'])
        for i in range(k):
            res += s[i] in vowels
        if res==k: return k
        temp = res
        for i in range(k,len(s)):
            temp += (s[i] in vowels) - (s[i-k] in vowels)
            res = max(temp,res)
            if res ==k: return k
        return res

时间复杂度:O(n),n 为字串长度
空间复杂度:O(1)
tensorstart commented 2 years ago

思路

滑动窗口

代码

var maxVowels = function(s, k) {
    let res=0;
    if (k>=s.length){
        for (let i = 0; i < s.length; i++) {
            if (s[i]==='a'||s[i]==='e'||s[i]==='i'||s[i]==='o'||s[i]==='u')
                res++;
        }
        return res;
    }else {
        for (let i = 0; i < k; i++) {
            if (s[i]==='a'||s[i]==='e'||s[i]==='i'||s[i]==='o'||s[i]==='u')
                res++;
        }
        let l=1,r=k,max=res;
        while (r<s.length){

            if (s[l-1]==='a'||s[l-1]==='e'||s[l-1]==='i'||s[l-1]==='o'||s[l-1]==='u') res--;
            if (s[r]==='a'||s[r]==='e'||s[r]==='i'||s[r]==='o'||s[r]==='u') res++;
            max=Math.max(max,res);
            l++;r++;
        }
        return max;
    }
};

复杂度分析

时间O(n) 空间O(1)

TonyLee017 commented 2 years ago

思路

wychmod commented 2 years ago

思路

就是一个滑动窗口吧,装数字,有就加上取最大

代码

class Solution:
    def maxVowels(self, s: str, k: int) -> int:
        st = ('a', 'e', 'i', 'o', 'u')
        n = 0
        ans = 0
        for i in range(k):
            if s[i] in st:
                n += 1
        ans = n
        index = 0
        for ch in s[k:]:
            if ch in st:
                n += 1
            if s[index] in st:
                n -= 1
            index += 1
            ans = max(ans, n)
        return ans

复杂度

时间复杂度 On 空间复杂度 O1

yangyuhuan commented 2 years ago

var maxVowels = function (s, k) { const vowels = new Set(['a', 'e', 'i', 'o', 'u']) let count = 0, l = 0, r = 0 while (r < k) { vowels.has(s[r]) && count++ r++ } let max = count while (r < s.length) { vowels.has(s[r]) && count++ vowels.has(s[l]) && count-- l++ r++ max = Math.max(max, count) } return max }; 时间复杂度: O(n) 空间复杂度 :O(1)

houyanlu commented 2 years ago

思路

维持一个k大小的滑动窗口,滑入的元素跟据是不是元音加1或者加0 滑出的元素则根据是不是元音减1或者减0

代码


class Solution {
public:
    int maxVowels(string s, int k) {
        int count = 0;
        for (int i = 0; i < k; ++i) {
            if (isVoweln(s[i])) {
                count++;
            }
        }

        int ans = count;
        // 后一个是不是元音,需要加1或减1
        // 出去的元素需要元音总数减去1或者0
        for (int i = k; i < s.size(); ++i) {
            count += isVoweln(s[i]) - isVoweln(s[i - k]);
            ans = max(ans, count);
        }
        return ans;
    }

    bool isVoweln(char ch) {
        return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u'; 
    }
};

复杂度分析

duantao74520 commented 2 years ago

class Solution { public: bool isVow(char c) { return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'; } int maxVowels(string s, int k) { int ret = 0; for (int i =0 ; i < k; i ++) { if (isVow(s[i])) { ret ++; } } int max_ret = 0; max_ret = max(max_ret, ret); for (int i = k; i < s.size(); i ++) { if (isVow(s[i])) { ret ++; } if (isVow(s[i-k])) { ret --; } max_ret = max(max_ret, ret); } return max_ret; } };

Yongxi-Zhou commented 2 years ago

思路

用temp和ctn记录当前窗口的元音数目和长度,然后更新窗口。

代码

    class Solution:
        def maxVowels(self, s: str, k: int) -> int:
            vo = ["a", "e", "i", "o", "u"]

            left, res = 0, 0
            ctn = 0
            temp = ""
            for i in range(len(s)):
                temp += s[i]
                # print(temp)
                if s[i] in vo:
                    ctn += 1

                while len(temp) > k:
                    char = s[left]
                    left += 1
                    temp = s[left: i + 1]
                    if char in vo:
                        ctn -= 1

                res = max(res, ctn)
            return res

复杂度

time O(N) space O(1)

MoonLee001 commented 2 years ago
var maxVowels = function(s, k) {
    const n = s.length;
    let count = 0;

    const isVowels = (s) => {
        return s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u' ? 1 : 0;
    }

    for (let i = 0; i < k; i++) {
        count += isVowels(s.charAt(i));
    }

    let ans = count;
    for (let i = k; i < n; i++) {
        const x = s.charAt(i - k);
        const y = s.charAt(i);
        count += isVowels(y);
        count -= isVowels(x);
        ans = Math.max(ans, count);
    }

    return ans;
};