Open azl397985856 opened 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)
滑动窗口
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)
滑动窗口
class Solution:
def maxVowels(self, s: str, k: int) -> int:
vowels = {'a', 'e', 'i', 'o', 'u'}
cnt = 0
for i in range(k):
if s[i] in vowels:
cnt += 1
res = cnt
for i in range(k, len(s)):
if s[i - k] in vowels:
cnt -= 1
if s[i] in vowels:
cnt += 1
res = max(res, cnt)
return res
就是一个滑动窗口吧,装数字,有就加上取最大
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
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)
维持一个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';
}
};
复杂度分析
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; } };
用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)
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;
};
1456. 定长子串中元音的最大数目
入选理由
暂无
题目地址
https://leetcode-cn.com/problems/maximum-number-of-vowels-in-a-substring-of-given-length
前置知识
暂无
题目描述